Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Ios 依赖于其他队列上的其他操作的NSOperation不会启动_Ios_Multithreading_Nsoperationqueue - Fatal编程技术网

Ios 依赖于其他队列上的其他操作的NSOperation不会启动

Ios 依赖于其他队列上的其他操作的NSOperation不会启动,ios,multithreading,nsoperationqueue,Ios,Multithreading,Nsoperationqueue,我有操作的依赖关系图,我使用多个队列来组织各种操作流。 例如,peopleQueue、sitesQueue、sessionQueue 会话队列:loginOp,fetchUpdateAccountop 人员队列:最常管理的客户端,剩余客户端SOP 站点查询:最常访问的站点SOP,其余站点SOP 依赖项: *all* -> loginOp remainingClientsOp -> mostFrequentlyManagedClientsOp remainingSitesOp ->

我有操作的依赖关系图,我使用多个队列来组织各种操作流。 例如,peopleQueue、sitesQueue、sessionQueue

会话队列:loginOp,fetchUpdateAccountop 人员队列:最常管理的客户端,剩余客户端SOP 站点查询:最常访问的站点SOP,其余站点SOP

依赖项:

*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