【问题标题】:Make NSOperations Mutually exclusive使 NSOperations 互斥
【发布时间】:2016-03-02 07:18:22
【问题描述】:

请参考来自 WWDC 的视频https://developer.apple.com/videos/play/wwdc2015/226/ 演讲者表明我们可以在两个相同类型的 NSopeation 实例之间添加依赖关系。显示警报的 NSoperation 示例。通过实现这一点,我们可以确保我们不会同时发出多个警报并惹恼用户。 如果已显示一个警报,则下一个警报将等待。

我仍然无法弄清楚如何实现 NSOperations 跨队列的这种依赖关系。用更简单的话来说,任何人都可以展示以下两件事的示例(实现)。

1.实现将队列2中的操作B添加到队列1中的操作A上。

2.添加相同NSOperation类型的多个实例的依赖的实现,即使它们在不同的队列中。示例:如果我将多个“AlertOperation”实例添加到不同的队列中,我想确保它们之间仍然按顺序发生。

如果示例是在 Objective C 中,我将不胜感激。 如果需要,请要求更多说明。

【问题讨论】:

  • 解释你的不同队列的用途。它们是如何以及何时创建的以及添加的操作?
  • 队列的目的可以是任何东西。关键是,在我上面提到的 WWDC 视频中,我可以在不同的队列中进行警报操作并使它们相互依赖。现在,如果来自队列 1 的警报操作已经显示警报,那么我希望来自队列 2 的警报操作等待显示,直到第一个警报操作结束(即解除警报)。这将确保当用户在他正在查看的屏幕上已经有一个警报时,我不会弹出另一个警报。
  • 我认为在它们之间添加依赖关系会给您带来一些问题?
  • 不完全是。问题是如何在来自不同队列的 nsoperation 之间添加依赖关系。就像我在上面的主要问题中举例说明的那样。
  • 当你在它们之间添加依赖时发生了什么?

标签: ios nsoperation nsoperationqueue


【解决方案1】:

我是演示该会话的工程师。

简短的回答是,为了使您的第二个操作依赖于第一个操作,您必须维护对第一个操作的引用。

会话提供的示例代码使用一个全局表来跟踪所有当前正在执行的操作。 When a new operation comes in that specifies it should be mutually exclusive 与其他同类操作,the code looks up in the table for the other operations of the same kind。然后新操作依赖于列表中的最后一个。

由于该表是全局表,因此无论操作实际在哪个队列上执行,它都能正常工作。它唯一需要的是使用自定义 NSOperationQueue 子类 ("OperationQueue") 作为执行操作的对象。

【讨论】:

  • 赞!我正在实施类似的事情。但不确定这是否是最好的方法。谢谢戴夫。
  • 我们能否希望今年的后续会议能够展示在不使用临时文件的情况下将数据从一个 NSOperation 传递到另一个的好技术?
  • @Mindaugas,如果您可以访问该论坛,我在这里找到了 Apple 开发人员的不错回复:https://forums.developer.apple.com/thread/25761
【解决方案2】:

从 cmets 来看,根本问题是:

当我没有对现有操作的引用时,如何向现有操作添加依赖项

您应该创建多个不同的队列,特别是在这种情况下,一个队列仅用于警报操作。从技术上讲,它可以与单个队列一起使用,但您需要做更多的工作。

使用特定队列,您可以简单地迭代队列中当前的操作并为每个操作添加依赖项。如果您没有特定的队列,那么您需要进行类测试(或使用其他一些逻辑)来准确确定要向哪些操作添加依赖项。

【讨论】:

  • 我们在这里有点离题了。我的问题仍然是上面主要问题主体中的两点。
  • 这回答了这些问题,您需要对特定队列上的操作进行分组以便找到它们,或者您需要搜索队列上的操作以找到正确的操作
猜你喜欢
  • 2011-01-06
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 2011-02-12
  • 2012-06-05
相关资源
最近更新 更多