2011-12-03 20 views
0

我已經有多個URL請求的程序,所以我使用的代碼在http://snippets.aktagon.com/snippets/350-How-to-make-asynchronous-HTTP-requests-with-NSURLConnection並把它放在它自己的類(B類)入門擊敗。要叫我簡單的初始化B類類在類A中,向類B的get方法([classname get:url])發送url,然後在返回時獲取服務器響應。使用NSURLConnection的,而是由競爭條件

的問題是,我收到由競爭條件擊敗由於事實didReceiveData:方法,通過返回我的方法的時候是不完整的。

我已經通過使用NSURLConnection的開發商例子走了,他們正在更新的觀點,一旦反應終於在這樣他們就不用打這個問題。

非常感謝您的幫助。

我需要保持異步調用由於我必須讓他們的數量,但我願意接受任何建議。

編輯(從答案移動)

我改變了代碼基於掀起了教程的GCD和我仍然得到由競爭條件敗下陣來。以下是我現在使用的代碼: 根據您的建議,我將其更改爲GCS,但我仍然被比賽條件所困住。下面是我改變它的代碼,我打電話給: NSString * responseStringClassA = [InitalizedInstanceOfClassA LogIn:@「username」@「password」];

//Log into the server 
    -(NSString *)logIn: (NSString *) username password:(NSString *) password 
    { 
    NSString* returnString; 
    dispatch_queue_t downloadQueue = dispatch_queue_create("Login", NULL); 
    dispatch_async(downloadQueue, ^{ 
    BOOL success = YES; 
    NSString *urlAsString =[NSString stringWithFormat:@""URL HERE]; 
    NSLog(@"url sent out: %@", urlAsString); 
    NSURL *url = [NSURL URLWithString:urlAsString]; 
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; 
    NSError *error = nil; 
    NSData *connectionData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:&error]; 
    NSLog(@"Connection Data: %@", [[NSString alloc] initWithData:connectionData encoding:NSASCIIStringEncoding]); 
    [returnString isEqualToString:[NSString stringWithUTF8String:[connectionData bytes]]]; 
    if ([connectionData length] > 0 && error == nil) { 
     //success 
     success = YES; 
    } 
    else if([connectionData length] == 0 && error == nil){ 
     //nodata 
     success = YES; 
    } 
    else if(error != nil){ 
     //error .. 
     success = NO; 
    } 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [returnString isEqualToString:[[NSString alloc] initWithData:connectionData encoding:NSASCIIStringEncoding] ]; 
    }); 
}); 
return returnString; 
}        
+2

你的問題不清楚。你注意到,「開發者的例子...... [更新]意見,一旦反應終於來了。」這就是你解決這個問題的方法。你真正的問題是什麼? –

+0

您的GCD方法具有相同的基本設計問題:如果您要在後臺執行此下載(您當然應該這樣做),則無法直接從此logIn:password:方法返回結果。該方法在最後一個塊可以在主隊列上運行之前肯定會返回,並且很可能在連接完成之前很久。另外,你爲什麼最後要做isEqualToString:比較? –

回答

1

這就是異步請求的目的,即intial方法幾乎立即返回而沒有完成工作。稍後,工作完成後,您會收到通知,您可以訪問並使用結果。

但很明顯,你正在尋找比異步操作別的東西。另一種方法是使用同步URL請求,但是從單獨的線程運行它們。實現這一目標的最好方式是使用GCD(大中央調度)。

注意,你可能不會更新從後臺線程的用戶界面。相反,當URL請求完成並且您想要顯示結果時,您必須致電performSelectorOnMainThreadNSObject的一部分)。

+0

(或者發送到'dispatch_get_main_queue()'只要GCD在混合中:) :) –

+0

@JonathanGrynspan:好點。 – Codo