Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何等待异步请求返回数据后再返回值_Objective C_Nsurlconnection_Nsmutableurlrequest_Nsurlconnectiondelegate - Fatal编程技术网

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你说得对。但我只给出了另一个选择。两者的作用相同。所以这只是他的选择。