2013-05-16 2 views
30

Cosa significa questo codice?dispatch_async e blocco in iOS

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     TMBaseParser *parser=[[TMBaseParser alloc] init]; 
     parser.delegate=self; 
     NSString *post =nil; 
     NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding]; 
     [parser parseForServiceType:TMServiceCategories postdata:postData]; 
    }); 

si prega di spiegare briefly.Thanks

+0

Quel codice sembra strano: prima 'POST' è impostata a' quelle negative. Nella riga successiva viene inviato un messaggio a 'post'. Quello non farà nulla, vero? – Maarten

+0

Se post == nil allora [post dataUsingEncoding: NSUTF8StringEncoding] restituirà anche nil. – ahwulf

risposta

95

Il pezzo di codice nella

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

}); 

viene eseguito in modo asincrono su un thread in background. Ciò avviene perché l'analisi dei dati può essere un'attività che richiede molto tempo e potrebbe bloccare il thread principale che interromperebbe tutte le animazioni e l'applicazione non sarebbe reattiva.

Se volete saperne di più, leggere la documentazione di Apple sul Grand Central Dispatch

+0

Bella spiegazione Marcin !!! – iAnurag

2

Questo è un blocco di Grand Central Dispatch.

  1. dispatch_async è una chiamata da eseguire su un'altra coda.
  2. dispatch_get_global_queue è una chiamata per ottenere una coda specifica con le caratteristiche desiderate. Ad esempio, il codice potrebbe essere eseguito a bassa priorità sul DISPATCH_QUEUE_PRIORITY_BACKGORUND.
  3. All'interno del blocco, il codice non fa nulla. Post è impostato su zero. Quindi un messaggio viene inviato a nil "dataUsingEncoding". Objective C drops all calls to nil. Infine, il parser viene inviato "nil" postData.
  4. Nella migliore delle ipotesi, questo non farà nulla. Nel peggiore dei casi inviando il parser, i dati nulli andranno in crash.
5

Se i frammenti di codice di cui sopra non funziona, allora, provate questo:

Objective-C:

dispatch_async(dispatch_get_main_queue(), ^{ 

}); 

aggiornamenti dell'interfaccia utente devono essere sempre eseguiti dalla coda principale. Il simbolo "^" indica l'inizio di un blocco.

Swift 3:

DispatchQueue.global(qos: .background).async { 
    print("This is run on the background queue") 

    DispatchQueue.main.async { 
     print("This is run on the main queue, after the previous code in outer block") 
    } 
} 
+0

Cosa fa il comando '',^''? E per quale versione rapida è questo esempio? – eonist

+0

@GitSyncApp, ho aggiornato la mia risposta. Si prega di controllare ... :) –

+0

sguardi (il threading in swift 3 è molto più pulito di prima) – eonist