【问题标题】:NSoperation how to use it to wait for event?NSoperation如何使用它来等待事件?
【发布时间】:2012-07-19 06:46:53
【问题描述】:

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

Concurrent Operations Demystified

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

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

【问题讨论】:

    标签: iphone ios nsurlconnection nsoperation


    【解决方案1】:

    本教程已过时,今天您可以更轻松地编写相同的代码。为您的请求创建一个 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 */
    }];
    

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

    【讨论】:

    • 是否有关于如何使用这些新功能的教程?
    • 不确定,谷歌搜索关键字。这些并不是真正的新功能,代码自 iOS 5 发布以来一直在工作。您正在查看的示例代码就是关于它的,其余的您可以通过尝试和阅读参考文档轻松弄清楚。跨度>
    • 好的,但我想使用异步请求,因为我正在接收一个大文件,我想向用户展示接收到多少数据的进度条......类似的东西那个教程。当整个文件被下载时,我想发送那个通知。 NSURLConnection 上有四个委托方法可以让我这样做,我只是以某种方式看到我的线程在发生之前没有完成,因为我不会收到任何东西。
    • 我认为您无法使用同步连接创建确定的进度条。剩下的很简单,但如果你真的需要进度条,你就得看看其他的解决方案,比如 Panagiotis 建议的ASIHTTPRequest
    • @zoul 我如何将 NSURLConnection 给出的&error 传递给completionBlock? (假设我使用了NSBlockOperation *blockOP = ...; [queue addOperation:blockOp]; 而不是addOperationWithBlock:
    【解决方案2】:

    如果您从网络获取数据,您可能需要使用Asihttprequest,它支持队列和同步/异步数据加载。

    【讨论】:

    • @zoul 回复后,是的,有 NSOperationQueue——但如果你想要简单,请使用 asi。
    • 在我看来,NSOperationQueue 与同步 NSURLConnection 的组合非常容易,取决于外部库。
    • 我们是在使用 ios 5 吗?因为我需要保持与 iphone 3 的向后兼容性(出于愚蠢的“经理”/利润原因),所以自从有人向我推荐了 Asi lib 之后,我就没有使用过。
    • NSBlockOperation 需要块,这意味着 iOS 5,IIRC。
    【解决方案3】:
    NSInvocationOperation *operation = [[NSInvocationOperation alloc]
         initWithTarget:self
         selector:@selector(Method)
         object:nil];
    [self.Queue addOperation:operation];
    

    【讨论】:

    • -1,我认为这并不能以任何相当直接的方式回答这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2021-01-06
    相关资源
    最近更新 更多