0

我已使用以下代码向网站发送异步请求:

NSMutableURLRequest *requestSiteToSendData = [NSMutableURLRequest requestWithURL:[[NSURL alloc]initWithString:@"www.example.com"] cachePolicy:NSURLRequestReloadIgnoringCacheData  timeoutInterval:30];
NSURLConnection *connectionToSiteToSendData = [[NSURLConnection alloc]initWithRequest:requestSiteToSendData delegate:self];

然后我使用里面定义的下面的方法NSURLConnectionDelegate,在数据获取完成后获取并解析数据。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    //parse 'data'
    NSString *parsedData = [self parseDataWithData:data];
}

然后在我发送异步请求的方法中,我返回parsedData. 但是只有在数据获取完成并因此解析完成后才会返回。我知道如果这是我需要的,那么问题就出现了,那么为什么我不使用同步请求。这是因为我不希望我的其他方法在后台加载时挂断。

4

4 回答 4

1

快速回答:如果它是异步的,你不想等待异步方法。最好的选择之一是:

  • 调用想要数据的对象应该将自己设置为运行异步方法的对象,在didReceiveData中调用一个方法如updateData:(NSString *)parsedData,处理新收到的数据

  • 调用该方法的对象应该使用 KVO 来观察运行异步方法的对象的属性的任何变化。

如果您需要更多信息,请告诉我。

于 2013-08-12T12:02:36.493 回答
0

据我了解,您希望在网络通话完成后返回数据。所以我建议为返回 NSData 的 webcall 创建任何方法并执行以下操作:

NSHTTPURLResponse* urlResponse = nil;
NSError *error = [[NSError alloc] init];  
NSData *responseData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&urlResponse error:&error];  

if ([urlResponse statusCode] >= 200 && [urlResponse statusCode] < 300) {
       // return responseData from here.
}
else {
        NSLog(@"%d",[urlResponse statusCode]);
        NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
        NSLog(@"%@",result);

}

而且您不想挂断您的视图。所以在后台线程中调用这个方法。像这样:

[self performSelectorInBackground:@selector(WebCallMethod) withObject:nil];

希望能帮助到你!!

于 2013-08-12T12:10:50.430 回答
0

异步请求在单独的线程上运行,因此我们无需担心处理视图锁定。如果要发送同步请求,则必须使用 GCD 来实现。而其他各种细节,如发送/接收的数据量等,在同步请求中将不可用。

如果您的代码下一个状态取决于响应请求时收到的数据,则同步请求会很有帮助。

于 2013-08-12T12:02:21.823 回答
0

您有这个委托方法,当从服务器成功完成所有下载时将执行该委托方法。使用此方法完成剩余过程

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // do something with the data
    // receivedData is declared as a method instance elsewhere
    NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]);
}

好的,当收到所有数据时,就会执行此方法。您应该做的是从-didReceiveData委托方法中收集所有数据,然后使用它在此方法中进行解析。

一个必须阅读的文件给你

于 2013-08-12T12:07:32.353 回答