5

Mi sono imbattuto in questo pezzo di codice e non riesco a capire perché l'autore abbia fatto questo. Date un'occhiata a questo codice:In questo caso è necessario dispatch_async (dispatch_get_main_queue(), ...)?

someMethodStandardMethodUsingABlock:^() { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [[NSNotificationCenter defaultCenter] postNotificationName:"notif" object:nil]; 
    }); 
}]; 

Ho un metodo con un blocco di completamento e in questo blocco deve essere inviata una notifica. Non capisco perché il dispatch_async sulla coda principale sia necessario in questo caso. Il blocco sarà già eseguito sul thread principale, e anche se non fosse, non penso che sarebbe davvero importante lo farebbe? Avrei semplicemente scritto:

someMethodStandardMethodUsingABlock:^() { 
    [[NSNotificationCenter defaultCenter] postNotificationName:"notif" object:nil]; 
}]; 

E funziona nei miei test.

Se puoi aiutarmi a far luce su questo, lo apprezzerei davvero!

Matt

risposta

9

Questi 2 frasi dal NSNotificationCenter Classe di riferimento suggeriscono un paio di possibili motivi:

Un centro di notifica fornisce notifiche agli osservatori sincrono. In altre parole, la postNotifica: i metodi non restituiscono finché tutti gli osservatori non hanno ricevuto ed elaborato la notifica .

...

In un'applicazione multithreading, le notifiche vengono sempre consegnati in thread in cui è stata pubblicata la notifica, che non può essere lo stesso filo in cui un osservatore stesso iscritto.

Quindi, forse, (a) l'autore non vuole il codice per bloccare fino a quando tutti gli osservatori hanno elaborato la notifica, e/o (b) che vuole garantire che i metodi osservatori corrono sul thread principale.

+0

Grazie a David, b sembra adattarsi al mio caso. I documenti non sembrano specificare, ma è importante se la notifica viene inviata su un thread diverso da quello registrato dall'osservatore? Con questo intendo che l'osservatore ha ancora raggiunto – MGA

+0

Sì, l'osservatore riceverà comunque la notifica anche se è stata inviata su un thread diverso. –

0

A volte è necessario eseguire i metodi che sparano un po 'esecuzione in modo asincrono e tornare subito. Per esempio. alcuni dei metodi "chiave" AppDelegate come applicationDidBecomeActive o applicationDidEnterBackground devono essere eseguiti e restituiti rapidamente in modo che il sistema operativo non uccida la tua app.

Non so se questo è il caso della tua domanda, ma è una possibile spiegazione dell'uso di dispatch_async.

Problemi correlati