2010-05-11 20 views
0

我正在使用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嗎?

如果只有一個單一的線程,如何可以在線程完成通過的代碼

回答

1

是塊解析1個響應和因爲,IMO,線程僅sequently執行跳轉到其它反應中,代碼塊,每個網絡請求可能有一個線程。訣竅是處理主線程上的響應。你應該有這樣的東西:

- (void)helper:(id <NCHelper>)helper didReturnItems:(NSArray *)items; 
{ 
    [self performSelectorOnMainThread:@selector(helperDidFinishGettingMyItems:) 
          withObject:items 
         waitUntilDone:NO]; 
} 

把響應放回主線程將避免一堆多線程問題。

此外,count的輸出永遠不會大於10.它只是多個線程可能同時運行 helperDidFinishGettingMyItems:。他們不會自動組合這兩個陣列。

該計數器可能會超過10個,因爲多個線程可能同時增加ivar。

+0

如果我們把它放回主線程,它會凍結我們的屏幕? 「只是多個線程可能同時運行helperDidFinishGettingMyItems:它們不會自動組合這兩個數組。」 我不明白這一點。如果兩個線程同時運行該方法並同時運行for循環,並且我的計數器是對象的屬性(它是共享的),我認爲它可以高達10以上我錯過了什麼? – vodkhang 2010-05-11 03:33:24

+0

凍結是由等待響應引起的,但這就是您在後臺線程中等待的原因。一旦響應到達,凍結完成,所以主線程可以處理響應。你是對的,櫃檯可能超過10個。對不起,我沒有意識到櫃檯是伊娃。 – 2010-05-11 05:05:22