我已經有多個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;
}
你的問題不清楚。你注意到,「開發者的例子...... [更新]意見,一旦反應終於來了。」這就是你解決這個問題的方法。你真正的問題是什麼? –
您的GCD方法具有相同的基本設計問題:如果您要在後臺執行此下載(您當然應該這樣做),則無法直接從此logIn:password:方法返回結果。該方法在最後一個塊可以在主隊列上運行之前肯定會返回,並且很可能在連接完成之前很久。另外,你爲什麼最後要做isEqualToString:比較? –