2012-09-24 39 views
0

我意識到這兩個url不會同時返回數據。我想知道我如何能夠確保網址同時返回。我怎麼能夠將此代碼更改爲GCD。這是建議嗎?我在代碼中創建了調度隊列,但它沒有繪製任何東西,不工作。沒有GCD它可以工作,但它不會在同一時間返回。任何幫助,將不勝感激!多個ASIHTTPRequests

-(void)httpRequest{ 

_weak ASIHTTPRequest *request1 = [ASIHTTPRequest requestWithURL:url1]; 
[request1 setCompletionBlock:^{ 
    NSString *responseString1 = [request1 responseString]; 
//dispatch_async(backgroundProcess1,^(void){ 
    [self plotOverlay1:responseString1]; 
//}); 
}]; 
[request1 setFailedBlock:^{ 
    NSError *error=[request1 error]; 
    NSLog(@"Error: %@", error.localizedDescription); 
}]; 

[request1 startAsynchronous]; 


_weak ASIHTTPRequest *request2 = [ASIHTTPRequest requestWithURL:url2]; 
[request2 setCompletionBlock:^{ 
    NSString *responseString2 = [request2 responseString]; 
//dispatch_async(backgroundProcess2,^(void){ 
    [self plotOverlay2:responseString2]; 
    //}); 
}]; 
[request2 setFailedBlock:^{ 
    NSError *error=[request2 error]; 
    NSLog(@"Error: %@", error.localizedDescription); 
}]; 

[request2 startAsynchronous]; 


} 

回答

1

您無法保證兩個獨立的異步請求將同時返回。

一個解決方案是鏈接請求 - 換句話說,在第一個請求的完成塊中啓動第二個請求 - 然後在第二個請求的完成塊中爲這兩個請求進行處理。

允許兩個請求並行運行的另一種方法是在您的類上創建屬性以保存來自請求的響應。在請求完成處理程序中,您可以將相應的屬性設置爲響應字符串的值,然後調用新的方法。該方法將檢查兩個請求的responseString屬性是否具有值,如果是,請執行處理,如果不是,則不執行任何操作。這樣,每當一個請求完成時(沒有關係首先完成),什麼都不會發生,但是一旦另一個請求也完成,您的處理將完成(對於兩個請求)。

-(void)httpRequest 
{ 
    _weak ASIHTTPRequest *request1 = [ASIHTTPRequest requestWithURL:url1]; 
    [request1 setCompletionBlock:^{ 
     self.responseString1 = [request1 responseString]; 
     [self checkIfBothRequestsComplete]; 
    }]; 
    [request1 startAsynchronous]; 

    _weak ASIHTTPRequest *request2 = [ASIHTTPRequest requestWithURL:url2]; 
    [request2 setCompletionBlock:^{ 
     self.responseString2 = [request2 responseString]; 
     [self checkIfBothRequestsComplete]; 
    }]; 
    [request2 startAsynchronous]; 
} 

- (void)checkIfBothRequestsComplete 
{ 
    if (self.responseString1 && self.responseString2) { 
     [self plotOverlay1:self.responseString1]; 
     [self plotOverlay2:self.responseString2]; 
    } 

} 
+0

非常感謝Jon Kroll。我非常感謝。我應該想到這個解決方案,簡單而整潔。現在我確定兩個url都能同時返回數據。我有我創建的方法(httpRequest)來調用URL的問題由計時器調用。然而,定時器每4秒調用一次(httpRequest),但是如果它執行繁重的任務,url響應不時會在同一時間匹配。例如timer = [NSTimer scheculedWith TimerInterval(4.0)target:(self)selector:@selector(httpRequest)userinfo:nil repeatats:YES]。對於這個問題,最好的解決方案是什麼?提前致謝 – casillas