2013-05-16 113 views
30

這段代碼是什麼意思?dispatch_async和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]; 
    }); 

請解釋一下

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

}); 

briefly.Thanks

+0

該代碼看起來奇怪:第一'POST'設置爲'nil'。在下一行中,一條消息被髮送到'post'。那什麼都不會做,是嗎? – Maarten

+0

如果post == nil,那麼[post dataUsingEncoding:NSUTF8StringEncoding]也會返回nil。 – ahwulf

回答

95

的一段代碼是在後臺線程異步運行。這樣做是因爲解析數據可能是一項耗時的任務,它可能會阻止主線程停止所有動畫,並且應用程序不會響應。

如果您想了解更多信息,請閱讀蘋果的Grand Central Dispatch

+0

好的解釋Marcin !!! – iAnurag

2

文檔這是一個大中央調度塊。

  1. dispatch_async是在另一個隊列上運行的調用。
  2. dispatch_get_global_queue是一個調用來獲得具有所需特徵的特定隊列。例如,代碼可以在DISPATCH_QUEUE_PRIORITY_BACKGORUND上以低優先級運行。
  3. 塊內部,代碼什麼都不做。帖子設置爲零。然後將消息發送到零「dataUsingEncoding」。 Objective C drops all calls to nil.最後,解析器發送「nil」postData。
  4. 充其量,這將無能爲力。最壞的情況是發送解析器零數據會崩潰。
5

如果上面的代碼段不工作,那麼,試試這個:

的Objective-C:

dispatch_async(dispatch_get_main_queue(), ^{ 

}); 

UI更新應始終從主隊列執行。 「^」符號表示塊的開始。

斯威夫特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

'',^''做什麼?這個例子的快速版本是什麼? – eonist

+0

@GitSyncApp,我已經更新了我的答案。請檢查它:) :) –

+0

看起來(在swift 3中的線程比以前要乾淨得多) – eonist

相關問題