2015-03-19 78 views
0

我想從服務器使用一些示例代碼檢索一些數據,如下所示。然而,它給了我不可預知的結果。我不確定這是因爲該塊在迴路中被取消分配或在內存中被覆蓋。 基本上數據不符合我期望的指數。目標C塊和For循環

-(void)retrieveSomeStuff { 

    for (int i = 0 ; i < items.count; i++) 
    { 
     [self retrieveDataForIndex:i 
       completionHandler:^(NSDictionary *data, NSError *error) { 


       }]; 

    } 
} 

-(void) retrieveDataForIndex:i completionHandler:(void(^)(NSDictionary *,NSError*) completionHandler { 

    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
     completionHandler(data,connectionError); 
    } 

} 

處理這種情況的最好方法是什麼?

+0

仍然使用MMM代替ARC? – 2015-03-19 06:31:34

+0

如果您想逐一處理,您應該只創建一個操作隊列。像靜態NSOperationQueue *隊列;如果(!隊列)隊列= [[NSOperationQueue分配]初始化]; queue.maxConcurrentCount = 1;然後sendAsynchronousRequest – Suen 2015-03-19 06:35:17

+0

您的代碼不會執行任何內容。你想展示什麼不起作用? – newacct 2015-03-19 19:16:42

回答

-1

爲避免重新分配,您必須複製方法「retrieveDataForIndex」中的塊。請參閱下面的修改。

typedef void(^CompletionHandler)(NSData * data, NSError * error); 

-(void) retrieveDataForIndex:(NSInteger)i completionHandler:(CompletionHandler)Completion 
{ 
    CompletionHandler _completionHandler = [Completion copy]; 
    NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.google.co.in"]]; 

[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) 
{ 
    _completionHandler(data, connectionError); 
    [_completionHandler release]; 
}]; 
} 

-(void)retrieveSomeStuff 
{ 
    for (int i = 0 ; i < 10; i++) 
    { 
     [self retrieveDataForIndex:i completionHandler:^(NSData *data, NSError *error) 
     { 
     NSLog(@"\nData Received"); 
     }]; 
    } 
} 
+0

是否在一次迭代後「CompletionHandler _completionHandler」變量被覆蓋? – rustylepord 2015-03-19 06:59:23

+1

否,因爲我們每次使用「複製」方法創建塊的新副本,並將此新塊地址用於「sendAsynchronousRequest」的完成塊中。這就是「sendAsynchronousRequest」在向其傳遞塊時的工作方式。 – 2015-03-19 07:09:41

+0

這個副本是完全沒有必要的。如果'Completion'在傳遞給操作隊列中的塊直接使用,那麼,如果該塊曾經被複制(其必須,以便它能夠被存儲和異步地執行),它將保留對象的指針類型的所有變量和複製它捕獲的塊指針類型的所有變量。 – newacct 2015-03-19 19:14:15