2017-05-24 80 views
0

例如,我有这样的自定义操作:如何运行异步操作

class CustomOperation: Operation { 

    override init() { 
     super.init() 
     self.qualityOfService = .userInitiated 
    } 

    override func main() { 
     // .. 
    } 
} 

这是我在做什么来运行CustomOperation

let customOperation = CustomOperation() 
customOperation.completionBlock = { print("custom operation finished") } 
customOperation.start() 

我有几个CustomOperation小号试图在同一时间运行。无论如何要运行它异步没有为每个CustomOperation创建OperationQueue?因为isAsynchronous属性是只读的。

+0

我建议你远离'Operation'和'OperationQueue',并使用'Dispatch'库来代替。它已经更新了Swift,因此它更好用,更易于使用,它更加灵活,而且它实际上是'Operation' /'OperationQueue'在内部使用的。你究竟想要完成什么? – Alexander

+0

@Alexander我试图从'UITableView'上显示的数组中执行每个对象的任务。如果一个对象将显示在'UITableViewCell'上,则操作开始。由于风格的原因,我使用'Operation'和'OperationQueue'。 – pableiros

+0

“风格的原因”? – Alexander

回答

1

您不必为每个操作创建一个队列。你可以把它们放在同一个队列中。队列的maxConcurrentOperationCount确定有多少个同时运行。

如果你根本不想使用队列,你需要重写start()和isAsynchronous()并让start()启动一个线程并运行。还有更多你需要比这做的(阅读文档)

https://developer.apple.com/reference/foundation/operation

转到“方法来覆盖部分”

如果要创建一个并发的操作,你需要重写

  • 起动()
  • isAsynchronous
  • :至少下列方法和属性
  • isExecuting
  • isFinished

在并发操作,您的start()方法是负责以异步方式开始操作。无论您是生成一个线程还是调用一个异步函数,都可以通过此方法来完成。在开始操作时,start()方法也应该更新isExecuting属性所报告的操作的执行状态。您可以通过发送关于isExecuting关键路径的KVO通知来完成此操作,从而让感兴趣的客户知道该操作正在运行。您的isExecuting属性还必须以线程安全的方式提供状态。