Frage

sizeWithFont in Multithreading abgestürzt ist, das ist die Debug-Informationen:

1 0x00a0df8e in icu::RuleBasedBreakIterator::handleNext
2 0x00a0daff in icu::RuleBasedBreakIterator::next
3 0x00a0d174 in icu::RuleBasedBreakIterator::following
4 0x35879719 in WebCore::nextBreakablePosition
5 0x3587842a in -[NSString(WebStringDrawing) _web_drawInRect:withFont:ellipsis:alignment:lineSpacing:includeEmoji:measureOnly:]
6 0x35877da3 in -[NSString(WebStringDrawing) _web_sizeInRect:withFont:ellipsis:lineSpacing:]
7 0x3090d238 in -[NSString(UIStringDrawing) sizeWithFont:constrainedToSize:lineBreakMode:lineSpacing:]
8 0x3090cee3 in -[NSString(UIStringDrawing) sizeWithFont:constrainedToSize:lineBreakMode:]

Jetzt löse ich den Fehler durch ein NSLock-Objekt, bevor Sie diese Funktion verwenden will ich dieses Objekt sperren, und nach dem Entsperren

, aber ich denke, es muss eine bessere Lösung sein!

und ich fand diese Fehler nur erscheint, wenn der NSString-Objekt für diese Funktion auf beiden zwei Threads sind Multi-Zeilen Text

War es hilfreich?

Lösung

In der Regel sollten Sie nicht invoke UIKit Methoden [1] von einem separaten Thread. Es spielt keine Rolle, ob Sie Schlösser nehmen, ist dies ein nicht-Starter ist.

Wenn Sie Multithread-Anwendungen verwenden, müssen Sie sicherstellen, dass jeder Code, der jede UIKit berührt ausführt auf der Haupt-Thread-Objekte. Dies wird erreicht, indem die Verwendung von performSelectorOnMainThread: withobject: waitUntilDone: Verfahren, welches die angegebenen Selektor auf der Haupt-Thread aufruft:

http://developer.apple.com/iphone/library/documentation/cocoa/reference/foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ / instm / NSObject / performSelectorOnMainThread: withobject: waitUntilDone :

oder in Monotouch: foo.InvokeOnMainThread (Delegierter {your_code_here});

[1] Mit iOS 4.0 die Regel für eine Handvoll APIs entspannt wird.

Andere Tipps

  • Die Formatierung, bitte.

  • „Lösen“ ein Multi-Threaded-Problem, indem zufällige Sperren um Objekte ist nie die richtige Antwort. Niemals. Multi-Threading erfordert systemische Gestaltung Ihrer Anwendung.

  • Wenn eine Sperre bedeutet "fix" das Problem, die zeigen, was Sie gesperrt und wie kritisch die Situation zu beurteilen.

  • Einige weitere Symptome wäre hilfreich. Code, insbesondere. Code in Ihren Fragen ist sehr nützlich.

das Fehlen von Beweisen gegeben, würde ich wetten, dass Ihr einen String in einem Thread mutieren beim Versuch, die Größe auf einem anderen zu greifen. Oder das Objekt wird auf einem Thread freigegeben wird, während es noch eine andere Verwendung. Oder Sie sind ein Objekt aus einem sekundären Thread zu manipulieren, die nicht sicher ist, fädeln.

Ich denke, performSelectorOnMainThread: withobject: waitUntilDone: richtig ist,

Vor, verwende ich eine Operation Textgröße zu berechnen, Und Verwendung waitUntilAllOperationsAreFinished im Hauptthread für den Betrieb der Rückkehr zu warten,
withobject: waitUntilDone im Betrieb, und stellen Sie den waitUntilDone Parameter auf Ja (Weil ich brauche das Ergebnis)
Aber wenn ich auch performSelectorOnMainThread verwenden Der Haupt-Thread wird stucked

So, jetzt entferne ich waitUntilAllOperationsAreFinished, und verwenden Sie ein asynchrones Objekt, um sicherzustellen, der Betrieb wird erst gestartet, wenn die vorherige beendet

                    [md removeAllObjects];
                    [md setObject:subString forKey:@"text"];
                    [md setObject:[NSNumber numberWithInt:view_w ] forKey:@"width"];
                    [md setObject:[NSNumber numberWithInt:height_left + font_h ] forKey:@"height"];
                    [self  performSelectorOnMainThread:
                     @selector(calculateTextRegion:)
                                            withObject:md
                                         waitUntilDone:YES];
                    CGSize stringSize = textRegion;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top