我可以在没有队列的情况下在另一个NSOperation内部启动NSOperation吗?

时间:2013-08-26 21:12:03

标签: ios nsoperation nsoperationqueue

我的应用程序获取当前设备位置,将其发送到我的服务器,并返回要在表格视图中显示的字典。目前我正在使用CLLocationManager委托方法和AFJSONRequestOperation(AFNetworking的retrieve-data-through-NSURLConnection-in-NSOperation类)来完成这项工作,但是这个功能在一个视图控制器方法中,我希望能够重用这个跨其他视图控制器。

我打算制作自己的NSOperation子类,但首先我想知道是否有任何看不见的陷阱让NSOperations(AFJSONRequestOperation)从另一个NSOperation内部开始。这是否按预期工作,或者我是否应该找到一种方法来在操作之间建立具有依赖关系的队列?

2 个答案:

答案 0 :(得分:2)

在NSOperation中调度NSULRL连接操作将失败,除非您在主运行循环上安排它。 AFJSONOperation(或AFURLOperation的任何子类)将成功,因为在引擎盖下,AFNetworking操作安排在他们自己的NSOperationQueue和自定义运行循环上。

所以 - 是的。去吧。我使用NSOperation子类来隔离我的所有工作进程。它比你的VC或模型中间的GCD更清晰。

警告 - 由于所有AFNetworking操作都是基于块的并且异步返回,因此您的NSOperation子类需要是并发的。 Apple提供了有关如何在Concurrent NSOperation Subclasses

的文档中构建此内容的详细说明

可选 - 您可以跳过构建并发NSOperation子类,并从NSOperation中同步激活网络操作,因为您已经离开主队列。

答案 1 :(得分:0)

所有NSOperation的东西都使用了GCD,而GCD对嵌套的dispatch_async调用没有任何问题,所以我怀疑嵌套NSOperations只要你的逻辑是正确的就会引起问题。