1

我有一个登录方法。在我使用 NSURLConnection 登录的方法内部,我希望返回 NSData 响应。问题是我在连接实际获取数据之前返回了 NSData 。

- (NSData*)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[responseData appendData:data]; //responseData is a global variable
NSLog(@"\nData is: %@", [[[NSString alloc] initWithData:responseData     
encoding:NSUTF8StringEncoding]autorelease]);//this works
isLoaded = YES; //isLoaded is a BOOL
}

- (NSData*)login:(NSString*)username withPwd:(NSString*)password{  
isLoaded = NO;
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request   
delegate:self];

if(connection){
    NSLog(@"Connected");
}
 while(isLoaded = NO){
[NSThread NSSleepForTimeInterval: 1]; 
}
isLoaded = NO;
return responseData;
}

程序卡在while循环中,但是没有while循环,程序可以从服务器检索数据,只是该方法似乎在委托方法更改之前返回了responseData。

所以我的问题是我怎样才能做到,只有在服务器完成后该方法才会返回 responseData ?

4

3 回答 3

1

除非另有说明,否则 NSURLConnection 会异步加载 URL。它使用委托回调来更新有关 URL 下载进度的委托。

具体来说,利用 NSURLConnection 委托的 connectionDidFinishLoading: 方法。一旦加载了所有数据,您的 NSURLConnection 对象就会调用它。您可以在此方法中返回数据。

您可以同步加载数据,但最终可能会阻塞 UI。

祝你好运!

于 2012-05-23T20:49:05.157 回答
1

你应该重构你的代码。

您正在使用异步调用(很好),但您尝试同步处理它(不太好 - 如果不使用单独的线程)。

要使用异步行为,您需要一个回调,在可可时尚中,这通常是一个委托方法(或者可能是更新代码的块)。其实是你的connection:didReceiveData。此方法将使用返回的数据——而不是您开始请求的数据。因此,通常启动异步请求的方法不会返回任何内容——当然也不会,预期从请求中返回的内容。

- (void)login:(NSString*)username withPwd:(NSString*)password
{  
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}


//Note: you cannot change the delegate method signatures, as you did (your's returns an NSData object)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    [self.responseData appendData:data]
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{ 
    //Now that the connection was successfully terminated, do the real work.
}

看看这个苹果示例代码

于 2012-05-23T21:54:46.080 回答
0

您可以使用同步请求方法

- (NSData*)login:(NSString*)username withPwd:(NSString*)password
{  
   NSError *error = nil;
   NSURLResponse *response = nil;

   NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]

   return responseDate;
}

文档: https ://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/occ/clm/NSURLConnection/sendSynchronousRequest:returningResponse:error :

于 2012-05-23T20:05:16.507 回答