Ios 依赖于其他队列上的其他操作的NSOperation不会启动
我有操作的依赖关系图,我使用多个队列来组织各种操作流。 例如,peopleQueue、sitesQueue、sessionQueue 会话队列:loginOp,fetchUpdateAccountop 人员队列:最常管理的客户端,剩余客户端SOP 站点查询:最常访问的站点SOP,其余站点SOP 依赖项:Ios 依赖于其他队列上的其他操作的NSOperation不会启动,ios,multithreading,nsoperationqueue,Ios,Multithreading,Nsoperationqueue,我有操作的依赖关系图,我使用多个队列来组织各种操作流。 例如,peopleQueue、sitesQueue、sessionQueue 会话队列:loginOp,fetchUpdateAccountop 人员队列:最常管理的客户端,剩余客户端SOP 站点查询:最常访问的站点SOP,其余站点SOP 依赖项: *all* -> loginOp remainingClientsOp -> mostFrequentlyManagedClientsOp remainingSitesOp ->
*all* -> loginOp
remainingClientsOp -> mostFrequentlyManagedClientsOp
remainingSitesOp -> mostFrequentlyAccessedSitesOp
当前设置有效:登录完成后,所有其他操作开始
MostFrequency*是一个允许快速应用响应的子集获取,后续op在后台获取更多数据(有时是页面)
最近我想我应该添加一个依赖于所有叶操作的操作。
这个最新的操作将充当一个哨兵,告诉我图形遍历何时完成(触发它将导致NSNotification post或其他事件)。因此:
然而,我发现,尽管它的所有依赖项都已完成,但sentinel操作从未启动/触发。
哨兵当时在sessionQueue上排队(没有特殊原因)
在调试器中玩过之后,我发现只有当sentinel只依赖于同一队列上的操作时,我才能启动它
我最终通过为该操作引入第四个队列来运行sentinel。
sentinel依赖于各自队列中的其他3个叶操作,然后在它们全部完成时被调用
我可以采用这种工作模式,但它确实让我感到困扰。
mac和iOS的测试结果都表明,队列间的依赖关系应该可以工作
我将需要进一步扩展该图,因此使用现有队列作为队列间依赖项会阻止操作的执行,这让我很烦恼。
显然,队列间依赖关系在某种程度上是有效的,因为我首先让loginOp成为其他操作的根依赖关系,而不管它们的队列是什么
将sentinel操作放在现有3个队列中的一个队列上有什么不对?我只使用了1个队列就解决了这个问题。我仍然不明白最初的实现有什么问题,但我学到了一些东西,消除了对多个队列的需要 首先,使用KVO观察等待操作的队列计数有点简单。这就是我如何摆脱哨兵(见) 其次,我维护了几个队列,以便在逻辑上分离出相关的操作。对于一个队列,我通过将操作生成方法组合到helper方法中获得了几乎相同的结果,每个逻辑单元1个,然后将helper返回的所有操作排队
我不确定从3个队列变为1个队列是否会影响性能。据我所知,只要操作是并发的,并且队列对当前执行没有限制,那么操作是分布在多个队列中还是全部分布在同一队列中都不重要。您的队列是并行的还是串行的?您是否尝试过其他现有队列?队列可能被阻塞,从而创建了一个事实上的依赖项。这三个队列都是并行的。我不确定我是否了解您关于现有队列的问题-您的意思是将操作放在类似于[NSOperationQueue mainQueue]的东西上吗?目前,所有队列都是使用[[NSOperationQueue alloc]init]创建的;
sentinelOp -> remainingClientsOp, remainingSitesOp, fetchUpdatedAccountOp