Iphone NSoperation如何使用它来等待事件?

Iphone NSoperation如何使用它来等待事件?,iphone,ios,nsurlconnection,nsoperation,Iphone,Ios,Nsurlconnection,Nsoperation,我的应用程序通过NSURLConnection连接到服务器(发送post请求),并从服务器接收一些数据。我希望这是发生在单独的线程背景。我看到了用于此目的的NSOperation——如本教程所示- 但这是一个有点老的教程(从2009年开始),也许会发现一些新的方法来做到这一点。基本上,我想做的是-启动NSOperation,等待它接收数据(因为如果我不这样做,线程将结束,数据将丢失),然后发出数据准备就绪的信号(可能通过nsnotificationcenter) 我发出的请求是异步的,所以我可

我的应用程序通过
NSURLConnection
连接到服务器(发送post请求),并从服务器接收一些数据。我希望这是发生在单独的线程背景。我看到了用于此目的的
NSOperation
——如本教程所示-

但这是一个有点老的教程(从2009年开始),也许会发现一些新的方法来做到这一点。基本上,我想做的是-启动
NSOperation
,等待它接收数据(因为如果我不这样做,线程将结束,数据将丢失),然后发出数据准备就绪的信号(可能通过
nsnotificationcenter


我发出的请求是异步的,所以我可以使用进度条等待数据。在NSOperation块中是否有我可以调用的东西导致线程在收到数据之前休眠?就像一些等待满足特定条件的循环一样?

如果您从您可能想要使用的web获取数据,它支持队列和同步/异步数据加载。

本教程已经过时,现在您可以更轻松地编写相同的代码。为您的请求创建一个
NSOperationQueue
,并将
NSOperationBlock
与同步
NSURLConnection
结合使用以下载数据:

[queue addOperationWithBlock:^{
    NSError *error = nil;
    NSHTTPURLResponse *response = nil;
    NSMutableURLRequest *request = /* build request */;
    NSData *data = [NSURLConnection
        sendSynchronousRequest:request
        returningResponse:&response
        error:&error];
    /* handle errors and callbacks */
}];

队列允许您设置并发请求的数量限制,还支持免费取消(当然不是在请求内部取消)。

在@zoul reply之后,是的,有NSOperationQueue——但是如果你想简单,请使用asi。在我看来,
NSOperationQueue
与同步
NSURLConnection
的结合非常简单,它比依赖外部库更简单。我们是在说ios 5吗?因为我需要保持与iphone 3的向后兼容性(出于愚蠢的“管理者”/“利润原因”),所以自从有人向我推荐Asi库后,我就一直没有使用过它。
NSBlockOperation
需要块,这意味着iOS 5,IIRC。有关于如何使用这些新功能的教程吗?不确定,谷歌搜索关键词。这些并不是真正的新功能,代码自iOS5发布以来就一直在运行。您正在查看的示例代码就是关于它的,其余的代码您可以通过尝试和阅读参考文档轻松了解。好的,但我想使用异步请求,因为我收到了一个大文件,我想向用户展示进度条,说明收到了多少数据。。。类似于那个教程的东西。当整个文件被下载时,我想发送通知。NSURLConnection上有四个委托方法可以让我这么做,我只是在某种程度上注意到我的线程在那之前没有完成,因为我不会收到任何东西。我认为你不能用同步连接创建一个确定的进度条。剩下的很简单,但是如果您真的需要进度条,您必须研究其他解决方案,如Panagiotis建议的解决方案。@zoul如何将NSURLConnection给出的
&error
传递到
completionBlock
?(假设我使用了
NSBlockOperation*blockOP=…;[queue addOperation:blockOP];
而不是
addOperationWithBlock:
-1,我认为这并没有以任何合理的直接方式回答这个问题。
NSInvocationOperation *operation = [[NSInvocationOperation alloc]
     initWithTarget:self
     selector:@selector(Method)
     object:nil];
[self.Queue addOperation:operation];