Objective c 如何等待异步请求返回数据后再返回值
我已使用以下代码向网站发送异步请求:Objective c 如何等待异步请求返回数据后再返回值,objective-c,nsurlconnection,nsmutableurlrequest,nsurlconnectiondelegate,Objective C,Nsurlconnection,Nsmutableurlrequest,Nsurlconnectiondelegate,我已使用以下代码向网站发送异步请求: NSMutableURLRequest *requestSiteToSendData = [NSMutableURLRequest requestWithURL:[[NSURL alloc]initWithString:@"www.example.com"] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30]; NSURLConnection *connectionToSi
NSMutableURLRequest *requestSiteToSendData = [NSMutableURLRequest requestWithURL:[[NSURL alloc]initWithString:@"www.example.com"] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30];
NSURLConnection *connectionToSiteToSendData = [[NSURLConnection alloc]initWithRequest:requestSiteToSendData delegate:self];
然后,我使用在nsurlconnectionelegate
中定义的以下方法在数据获取完成后获取和解析数据
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
//parse 'data'
NSString *parsedData = [self parseDataWithData:data];
}
然后在发送异步请求的方法中,返回
parsedData
。但是返回应该只在数据获取完成并因此完成解析之后发生。我知道问题出现了,如果这是我需要的,那么为什么我不使用同步请求。这是因为我不想让我的其他方法在后台加载时挂起。异步请求在单独的线程上运行,所以我们不需要担心处理视图锁定。
如果您想要发送同步请求,那么您必须使用GCD来实现相同的目的。同步请求中不提供其他各种细节,如发送/接收的数据量等
如果代码的下一个状态依赖于响应请求时收到的数据,则同步请求很有用。快速回答:如果是异步的,则不希望等待异步方法。 最佳选择之一是:
- 调用数据的对象应将自身设置为运行异步方法的对象,并且在didReceiveData中,您可以调用诸如
之类的方法,该方法处理新接收的数据updateData:(NSString*)parsedData
- 调用该方法的对象应该使用KVO来观察运行异步方法的对象的属性上的任何更改
如果您需要更多信息,请告诉我。您有此委托方法,当从tha服务器成功完成所有下载后,将执行此方法。使用此方法完成剩余的过程
- (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
委托方法收集所有数据,然后在此方法中使用它进行解析
据我所知,您希望在web调用完成后返回数据。因此,我建议为webcall创建任何返回NSData的方法,并执行以下操作:
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];
希望能有帮助 我甚至尝试过这样做,但在加载完成之前返回了数据。我尝试递归调用,直到数据被提取,但这导致应用程序崩溃,什么也没发生。实际的问题是,只有在加载完成后才应该返回值,并且所有其他方法都应该按原样工作而不挂起。希望我清楚。请询问您是否对该问题有任何不了解的地方。请查看编辑并查看链接以了解您正在尝试的内容。实际问题是,只有在加载完成后才应返回值,并且所有其他方法都应按原样工作而不会挂起。但在我的例子中,return是在加载完成之前调用的。希望我清楚。请询问关于这个问题您是否有什么不明白的地方。是的,我明白您的意思,这是正常的:由于请求是异步发出的,所以在异步调用完成时,函数的其余部分将继续。我理解您希望您的方法等到它实际完成,但这不是一个好主意或实践。服务器可能永远不会应答并使您的应用程序无响应,还有许多其他原因。您应该使用自己制作的委托或KVO来处理此问题。如果你需要帮忙,我很乐意帮忙。你可以用陌生人的回答等着,但我不会那样做。(无响应的应用程序等)。好的。。使用自制的代理解决了问题。谢谢。实际的问题是,只有在加载完成后才应该返回值,并且所有其他方法都应该按原样工作,而不会挂起。但在我的例子中,return是在加载完成之前调用的。希望我清楚。请询问您是否对该问题有任何不了解的地方。然后使用
[NSThread]
创建同步而不是异步请求。并在加载完成时调用它。这不会挂起你的应用程序。所以这里的基本原则是,在后台运行的同步请求将产生与异步请求相同的效果?即使是这样,即使请求加载到后台,它仍然会返回数据,对吗?@HarikrishnanT你说得对。但我只给出了另一个选择。两者的作用相同。所以这只是他的选择。