Bis iOS 3.2 habe ich diese Art von Code verwendet, um UIImageView
image im Hintergrund zu laden, und es hat gut funktioniert ...
Code:
%Vor% ... auch wenn [UIImageView setImage:]
nicht Thread-sicher war!
Aber seit iOS 4 funktioniert es nicht mehr ... Bilder erscheinen zwei Sekunden nach dem Aufruf von setImage
auf dem Bildschirm. Und wenn ich ein [myImageView performSelectorOnMainThread:@selector(setImage:) withObject:newImage waitUntilDone:YES]
anstelle von [myImageView setImage:newImage]
mache, erscheinen Bilder sofort, scheinen jedoch während des laufenden Vorgangs neu dekodiert zu werden (wobei das vorherige [UIImage imageNamed:]
ignoriert wird, das die Bilddaten bereits decodiert haben sollte), was eine Pause verursacht auf meinem Hauptthread ... Auch wenn Dokumentation sagt Der zugrunde liegende Bild-Cache ist unter allen Threads geteilt. .
Irgendwelche Gedanken?
Mach es nicht im Hintergrund! Es ist nicht threadsicher. Da ein UIImageView
auch ein NSObject
ist, denke ich, dass die Verwendung von -[performSelectorOnMainThread:withObject:waitUntilDone:]
funktionieren könnte, wie:
Und es ist UIImage
, das neu threadsicher gemacht wird. UIImageView
ist immer noch nicht Thread-sicher.
performSelectorInBackground:
führt einen Selektor in einem Hintergrund-Thread aus. Dennoch setImage: ist eine UI-Funktion. UI-Funktionen sollten nur für den Hauptthread ausgeführt werden. Ich habe keinen Einblick in das spezielle Problem, aber dies ist das erste Gefühl für diesen Code, und es kann sein, dass iOS4 den (nicht unterstützten) Mechanismus zum Ausführen von UI-Funktionen in Hintergrund-Threads irgendwie anders behandelt.
Sagen wir:
@property(nonatomic, readonly) CGImageRef CGImage
Diskussion
Wenn die Bilddaten aufgrund von Speicherbeschränkungen gelöscht wurden, erzwingt das Aufrufen dieser Methode das Zurückladen der Daten in den Speicher. Das erneute Laden der Bilddaten kann zu einer Leistungseinbuße führen.
Sie können also möglicherweise image.CGImage
aufrufen. Ich denke nicht CGImages
sind faul.
Wenn das nicht funktioniert, können Sie eine Wiedergabe mit etwas wie
erzwingen %Vor% Manche Leute warnen vor Fadensicherheit. Die Dokumente sagen " UIGraphics{Push,Pop,GetCurrent}Context()
" sind nur "main-thread", aber nichts über UIGraphicsBeginImageContext()
. Wenn Sie sich Sorgen machen, verwenden Sie CGBitmapContextCreate
und CGContextDrawImage
.
Tags und Links multithreading ios4 uiimage