2013-02-15 124 views
2
 dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.teamName becomeFirstResponder]; 
    }); 

我正在和一位朋友聊天,他告訴我他聽說使用dispatch_async不是很好,但他不知道爲什麼。dispatch_async爲什麼不好?完成相同任務的更好方法是什麼?

我查了谷歌,爲什麼這個代碼是錯誤的

我怎樣才能在這個代碼改進並沒有發現任何理由?有沒有更好的方法來做到這一點?

注:我還在學習iOS編程,所以我對這件事情是新的。

+1

您發佈的代碼非常好,如果從後臺線程或隊列中調用,則非常典型。我從來沒有聽說過有關dispatch_async的任何錯誤。 – rmaddy 2013-02-15 03:46:26

+0

dispatch_async很棒。線程是非常困難的,但派遣只會讓它更容易一些。深刻理解發生的事情是關鍵。 – 2013-02-15 18:04:45

+0

永遠不要相信程序員的意見(明確包括自己)誰不能完全告訴你爲什麼*有什麼不好/要避免。 – LearnCocos2D 2013-09-24 16:16:31

回答

5

你的朋友錯在認爲dispatch_async是「壞」。

但是,要求另一個處理器像做第一個響應者那樣簡單,沒有任何意義!建立派遣需要一些時間,並且幾乎沒有時間成爲第一響應者。 更糟糕的是,如果作爲第一響應者的副作用可能涉及諸如繪圖等事情,需要在主線程上完成。

使用dispatch_async將處理器或網絡密集型任務轉移到其他線程。具體閱讀Grand Central Dispatch,以及一般的併發編程。它功能強大,但像所有強大的編程結構一樣,如果你不明白你在做什麼,它可能會造成麻煩。

你的朋友可能一直在想的是,iPhone和iPad沒有像典型的Macintosh那樣多的處理內核,有些只有一個內核。在這些上,你不會得到一次使用多個處理器的好處。但是仍然有很好的理由來做像異步獲取網頁的東西,所以它們不會中斷諸如滾動或導航動畫之類的東西。

+6

如果從後臺線程或隊列調用dispatch_async,則發佈的代碼正確使用,因爲所有UI代碼都必須位於主線程中。 – rmaddy 2013-02-15 03:55:04

+0

非常正確:假設我們正在調度到一個全球隊列,我很sl in。將編輯。 – 2013-02-15 04:00:50

+0

謝謝。我想是做對了,我會閱讀大中央調度。 – JoseSwagKid 2013-02-15 04:04:14

3

我不知道你的朋友是指,但

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.teamName becomeFirstResponder]; 
}); 

dispatch_async是非常強大的。作爲新手,您將主要使用它在與UI不同的隊列中運行一些密碼,以便UI保持響應,一旦您有值(或圖像或任何需要更新的UI相關),您將最終如上所述調用主隊列。

堅持事實..不要擔心你的朋友。

+0

好的謝謝。對不起,我很擔心,因爲我的朋友一直在做iOS工作大約2年,而且我是全新的(1周),所以我只是假設他可能會做些什麼。再次感謝 – JoseSwagKid 2013-02-15 04:03:36