iOS4 & Hintergrund [UIImage setImage:]

8

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?

    
Damien Debin 28.06.2010, 00:16
quelle

4 Antworten

4

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:

%Vor%

Und es ist UIImage , das neu threadsicher gemacht wird. UIImageView ist immer noch nicht Thread-sicher.

    
Evadne Wu 28.06.2010 00:39
quelle
3

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.

    
Jaanus 28.06.2010 00:37
quelle
1

Wenn Sie iOS 4.0 verwenden, sollten Sie wirklich in Blöcken und GCD nachlesen. Mit diesen Technologien können Sie Ihre Methode einfach durch ersetzen:

%Vor%     
James J 28.06.2010 03:55
quelle
1

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 .

    
tc. 28.06.2010 16:10
quelle

Tags und Links