我正在使用Objective-C中的網絡請求 - 響應。有一些我不明白的異步模型。Objective-C中網絡的異步回調Iphone
總之,我有一個觀點,將顯示我的2個社交網絡的狀態:Twitter和Facebook。當我點擊刷新時,它會調用模型管理器。那位模特經理會打電話給2位服務助手索要最新的物品。當2個服務助手接收到數據時,它將回傳給模型管理器,並且該模型將所有數據添加到排序後的數組中。
我在這裏不理解的是:當社交網絡的響應回來時,有多少線程會處理響應。根據我對多線程和網絡的理解(使用Java),必須有2個線程處理2個響應,這2個線程將執行代碼以將響應添加到數組中。那麼,它可能有競爭條件,程序可能會出錯?它是iphone objective-C的正確工作模式嗎?或者他們用不同的方式來完成它不會有競爭條件,我們不必關心鎖定,同步?
這裏是我的示例代碼:
ModelManager.m
- (void)updateMyItems:(NSArray *)items {
self.helpers = [self authenticatedHelpersForAction:NCHelperActionGetMyItems];
for (id<NCHelper> helper in self.helpers) {
[helper updateMyItems:items]; // NETWORK request here
}
}
- (void)helper:(id <NCHelper>)helper didReturnItems:(NSArray *)items {
[self helperDidFinishGettingMyItems:items callback:@selector(model:didGetMyItems:)];
break;
}
}
// some private attributes
int *_currentSocialNetworkItemsCount = 0; // to count the number of items of a social network
- (void)helperDidFinishGettingMyItems:(NSArray *)items {
for (Item *item in items) {
_currentSocialNetworkItemsCount ++;
}
NSLog(@"count: %d", _currentSocialNetworkItemsCount);
_currentSocialNetworkItemsCount = 0;
}
我想問一下是否有該方法helperDidFinishGettingMyItems被同時調用情況。這意味着,例如,faceboook會返回10個項目,twitter會返回10個項目,count的輸出將會大於10嗎?
如果只有一個單一的線程,如何可以在線程完成通過的代碼
如果我們把它放回主線程,它會凍結我們的屏幕? 「只是多個線程可能同時運行helperDidFinishGettingMyItems:它們不會自動組合這兩個數組。」 我不明白這一點。如果兩個線程同時運行該方法並同時運行for循環,並且我的計數器是對象的屬性(它是共享的),我認爲它可以高達10以上我錯過了什麼? – vodkhang 2010-05-11 03:33:24
凍結是由等待響應引起的,但這就是您在後臺線程中等待的原因。一旦響應到達,凍結完成,所以主線程可以處理響應。你是對的,櫃檯可能超過10個。對不起,我沒有意識到櫃檯是伊娃。 – 2010-05-11 05:05:22