2013-10-25 174 views
1

我環顧四周,似乎找不到適合我的問題的正確答案。截至目前,我擁有一個網絡引擎,並將其從每個視圖控制器委派給其執行我的網絡活動。遇到多個NSURLConnection問題

例如,要獲得用戶的詳細信息我有一個這樣的方法:

- (void) getUserDetailsWithUserId:(NSString*) userId 
{ 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@Details", kServerAddress]]]; 
    request.HTTPMethod = @"POST"; 

    NSString *stringData = [NSString stringWithFormat:@"%@%@", kUserId, userId]; 
    NSData *requestBodyData = [stringData dataUsingEncoding:NSUTF8StringEncoding]; 
    request.HTTPBody = requestBodyData; 

    NSURLConnection *conn = [[NSURLConnection alloc] init]; 
    [conn setTag:kGetUserInfoConnection]; 
    (void)[conn initWithRequest:request delegate:self]; 
} 

當我得到connectionDidFinishLoading數據,我收到一個NSDictionary的數據,並根據我設置的標籤爲了連接,我將數據傳輸到所需的NSDictionary

這工作正常。但是現在我需要兩個來自同一視圖控制器的請求。所以當我這樣做的時候,數據越來越混亂。假設我有一個正在執行搜索的連接,當我執行搜索時,來自用戶詳細信息的數據可能會出現。根據我在connectionDidFinishLoading內部進行的切換,數據未被分配到正確的NSDictionary。我爲整個網絡引擎使用了一個代理。

我是新來的NSURLConnection,我應該設置一個隊列還是什麼?請幫忙。

編輯

這裏的一部分,我在connectionDidFinishLoading接收數據:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    if ([connection.tag integerValue] == kGetUserDetails) 
     networkDataSource.userData = self.jsonDetails; 
    if ([connection.tag integerValue] == kSearchConnection) 
     networkDataSource.searchData = self.jsonDetails; 
} 

並在此之後我有一個要求所需的視圖控制器所需的委託的開關情況。

回答

3

阿尼爾在這裏,你需要確定哪些要求你得到了數據,以檢查它是如下 最簡單的方法,

- (void)connectionDidFinishLoading:(NSURLConnection *)conn 
{ 
    // Check URL value for request, url for search and user details will be different, put if condition as per your need. 
    conn.currentRequest.URL 
} 

嘗試使用conn.originalRequest.URL它會給原始請求。

+1

這聽起來像個好主意。我會給你一個鏡頭。 – Anil

+0

好的,如有任何問題,請告知我。 –

+0

我也一樣。但是當我發送請求時,比如說我在下載用戶詳細信息時(比如網速很慢)進行搜索,則用戶詳細信息調用不會繼續。只有搜索發生。 – Anil

-2

在.h文件中聲明兩個NSURLConnection變量。

NSURLConnection *conn1; 
NSURLConnection *conn2; 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{ 

    if(connection == conn1){ 

    } 
    else if(connection == conn2){ 

    } 

} 
+1

我是不是在做同樣的事情?我爲每個連接分配了不同的NSURLConnection NSURLConnection * conn = [[NSURLConnection alloc] init]; – Anil

1

你可以用很多方式完成他人提到的任務,它會解決你的問題。但是如果你有更多的連接,你需要改變你的方法。

您可以創建一個NSOperation類的子類。通過將字典或數據模型傳遞給該類,提供所有必需的數據,例如url或任務完成時想要返回的任何其他任何通知。

在Nsoperation類中ovewrite'main'方法並在該方法中啓動連接,即將所有NSURRequest語句放在該方法中。當下載完成時與該信息字典一起發送回電話。

要記住的要點:爲evey下載創建操作類的separte實例,並調用其「啓動方法」。

它看起來是這樣的:

[self setDownloadOperationObj:[[DownloadFileOperation alloc] initWithData:metadataDict]]; 

    [_downloadOperationObj setDelegate:self]; 

    [_downloadOperationObj setSelectorForUpdateComplete:@selector(callBackForDownloadComplete)]; 

    [_downloadOperationObj setQueuePriority:NSOperationQueuePriorityVeryHigh]; 

    [_downloadOperationObj start]; 

metaDict將包含用戶信息。 在DownloadFileOperation類將覆蓋「主」的方法,如:

- (void)main { 
    // a lengthy operation 
    @autoreleasepool 
    { 
     if(self.isCancelled) 
      return; 

//  //You url connection code 
    } 
} 

你可以,如果你想要的操作添加到NSOperationQueue。您只需要將操作添加到NSOperationQueue,它將調用其啓動方法。