so che è sicuro per disegnare su qualsiasi thread finché io chiamoQuesto thread di codice grafica è sicuro?
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
UIGraphicsEndImageContext();
sullo stesso thread.
Prendere uno screenshot di una vista tramite questo metodo richiede circa 300 ms, che non è male, ma sono in una situazione difficile, quindi voglio farlo in una discussione in background.
Ecco quello che sto facendo:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
});
L'unica cosa che qui in questione è il view
, che si trova sul thread principale. È sicuro chiamare renderInContext
su un view.layer
da un thread in background? O in generale, è sicuro leggere solo un oggetto UIKit da un altro thread?
(E per favore non darmi il default "UIKit non è thread-safe" risposta. So già che. Questo qui è un caso particolare (e non venitemi a dire non ci sono casi speciali).)
(il codice qui sopra funziona bene, ma non sono sicuro se questo è solo una coincidenza.)
Non credo che otterrete una risposta definitiva a questa domanda perché da nessuna parte nella documentazione Apple dichiarerà qualcosa di diverso da "UIKit non è thread-safe" (insieme alle eccezioni elencate). Ciò che otterrai sono opinioni ed esperienze di altre persone ma, come hai detto tu, il codice sopra funziona bene, ma chi dice che lo farà sempre e anche se qualcun altro ti dice che lo farà, vero? – Rog
Le regole di threading si applicano anche alla modifica o alla lettura di un oggetto? – Snowman
E se faccio una copia della vista prima, così sono sicuro che questo metodo sarebbe l'unico che ha accesso a questa nuova copia? – Snowman