N操作:如何暂停和恢复

问题描述 投票:0回答:2

我有一个用于复制文件的 NSOperation。我使用 write() 复制文件,然后可以在每个 write() 之间“暂停”复制。 但是我不知道如何:

  • 告诉操作它应该暂停(从 UI 主线程)
  • 暂停操作(我认为“while (isPaused==YES)”不是正确的选项
  • 告诉操作继续

感谢您的帮助

objective-c multithreading cocoa nsoperation
2个回答
2
投票

你可以用信号量来做到这一点;但与其使用信号量来控制对一段代码的访问(即获取锁、使用资源、释放锁模型),不如将其视为一个门 - 获取、测试条件/块、释放并继续。

NSCondition
会给你一个高级信号量。在概述中,第 3 步是“测试我是否应该暂停”,第 4 步和第 5 步变成“不,所以什么都不做”。


0
投票

我会回顾一下美丽的评论,提前带点“哲学”。

NSOperation
队列的使用首先是 RID US 从需要信号量、触发、监视触发器、轮询条件等等。如果您发现自己正在处理这些“旧式”并发问题,那么您很可能走错了路,偏离了
NSOperationQueue
的道路。它必须很简单。它必须没有“螺纹边缘”。

现在,你如何打破一个长

NSOperation
到受控和管理的过程?

简单地说,通过将

NSOperation
分解成一系列更小的 NSOperations。在你的情况下 - 每个
NSOperation
会(比如说,只是例子)复制一个文件。

在这里——您可以使用包含 NSOperationQueue 和 NSOperation 的大量工具。

  • 可以使用依赖关系来设置链的连续性和执行顺序。并维护多个并发链。
  • 您可以使用取消来打破链条并停止它。
  • 您可以简单地暂停和恢复
    NSOperationQueue
    来实现您的效果,因为您知道您的每个“原子”操作(比如完成单个文件)都得到了正确处理。
  • 您可以使用与
    NSProgress
    完美集成的
    NSOperationQueue
    免费获得您的“进度”。
  • 您可以将“相关”操作卸载到其他优先级更高或更低的队列,以优化您的性能(比如一个用于更高级别的 UI 处理,一个用于较低级别的文件系统操作。

真的无穷无尽,做起来也很容易

最后 - 如果你想享受比

NSOperation
开箱即用的“更好的依赖”机制 - 看看我的 自己的问题 并阅读美丽的答案,以及我自己对问题的看法。

© www.soinside.com 2019 - 2024. All rights reserved.