這是一個兩部分問題。希望有人可以回答一個完整的答案。併發操作所需的說明,NSOperationQueue和異步API
NSOperation
s是強大的對象。它們可以是兩種不同的類型:非併發或併發。
第一種類型同步運行。您可以通過將其添加到NSOperationQueue
中來利用非併發操作。後者爲你創建一個線程。結果包括以並行方式運行該操作。唯一的警告是關於這種操作的生命週期。當它的main
方法結束時,它將從隊列中移除。在處理異步API時,這可能會成爲問題。
現在,併發操作呢?從蘋果公司的文檔
如果你想實現一個併發的操作,也就是說,一個相對於調用線程,你必須寫 額外的代碼異步運行 異步開始操作。例如, 可能會產生一個單獨的線程,調用異步系統功能或執行其他任何操作來確保啓動方法啓動 任務並立即返回,並且很可能在完成 任務之前。
這對我來說已經很清楚了。他們異步運行。但是你必須採取適當的行動來確保他們這樣做。
我不清楚的是以下幾點。醫生說:
注:在OS X v10.6中,操作隊列忽略 isConcurrent返回並隨時調用從 單獨的線程的操作啓動方法的價值。
它的真正含義是什麼? 如果我在NSOperationQueue
中添加併發操作,會發生什麼情況?
然後,在此帖子Concurrent Operations中,併發操作用於通過NSURLConnection
(以其異步形式)下載某些HTTP內容。操作是併發的並且包含在特定隊列中。
UrlDownloaderOperation * operation = [UrlDownloaderOperation urlDownloaderWithUrlString:url];
[_queue addOperation:operation];
由於NSURLConnection
需要一個循環運行,作者分流start
方法在主線程(所以我想添加操作到隊列它產生一個不同的一個)。以這種方式,主運行循環可以調用操作中包含的委託。
- (void)start
{
if (![NSThread isMainThread])
{
[self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO];
return;
}
[self willChangeValueForKey:@"isExecuting"];
_isExecuting = YES;
[self didChangeValueForKey:@"isExecuting"];
NSURLRequest * request = [NSURLRequest requestWithURL:_url];
_connection = [[NSURLConnection alloc] initWithRequest:request
delegate:self];
if (_connection == nil)
[self finish];
}
- (BOOL)isConcurrent
{
return YES;
}
// delegate method here...
我的問題是以下內容。 此線程安全嗎?運行循環偵聽源代碼,但調用的方法在後臺線程中調用。我錯了嗎?
編輯
我已經完成了我自己的一些測試基於由Dave Dribin提供的代碼(見1)。我注意到,正如你所寫的,NSURLConnection
的回調在主線程中被調用。
好吧,但現在我仍然非常困惑。我會試着解釋我的疑惑。
爲什麼在一個併發操作中包含一個異步模式,其中在主線程中調用其回調函數?將start
方法調度到主線程,它允許在主線程中執行回調,以及隊列和操作如何?我在哪裏可以利用GCD提供的線程機制?
希望這是明確的。
roland,首先,感謝您的回覆。這裏有很多概念。 +1爲您提供支持。我對使用併發操作和異步模式(如NSURLConnection)的方法存在一些疑問。如果在主線程中調用了'NSURLConnection'的回調函數,那麼使用兩者的優點是什麼?我怎樣才能利用* CDG *?看我的編輯。再次感謝你。 –
'NSOperation'是封裝任何長期運行的可並行任務的自然方式(不管線程優勢如何)。 'NSURLConnection'通過它的委託方法(在哪裏放置響應數據,如何響應重定向等)爲你提供很多控制,但它們是異步的,所以如果你想在'NSOperation'中使用它們,這意味着它有是併發的(否則該操作將不會超過其「開始」方法的退出並繼續等待委託回調)。 – roland
另一個主要優勢是,它允許您隨時取消連接(例如,如果您正在加載用戶剛剛解僱的視圖的圖像),這是通過Cocoa的其他連接技術無法實現的。你甚至可以重寫'NSOperation'的'cancel'方法並同時'取消'NSURLConnection'。 – roland