【问题标题】:NSOperation to manage series of functionsNSOperation 管理一系列功能
【发布时间】:2015-10-17 02:38:42
【问题描述】:

我有多个功能应该按顺序进行。而function1function3 在后台线程中运行。他们的功能是findObjectsInBackgroundWithBlockFunction 2 可以发生在主线程或后台线程上,但它应该在function 1 之后运行,而function 3 应该在function2 之后发生。我了解了NSOperationNSOperationQueue,但我不确定如何真正使用它。根据我的研究,我只能将类改为子类NSOperation。它是否正确?我想让每个函数都在NSOpeation 之下。以下是我认为正确的方式。这是正确的方法吗?将 function1() 放在NSOperation 中是否正确,如下所示?最后,当 function 1 & 3 之类的后端线程中发生某些功能时,它是否会影响 NSOperationQueue ?谢谢

var operationQueue = NSOperationQueue()
let operation1 : NSOperation = NSOperation(function1())
let operation2 : NSOperation = NSOperation(function2())
let operation3 : NSOperation = NSOperation(function3())

operation2.addDependency(operation1)
operation3.addDependency(operation2)

operationQueue.addOperation(operation1)
operationQueue.addOperation(operation2)
operationQueue.addOperation(operation3)        

func function1 () {
//do something and save data in this class's property
}

func function2 () {
//get data from class's property(data from function1) and do something
//save the result in class's property
}

func function3 () {
  //get data from class's property(data from function2) and do something
 //save the result in class's property
}

【问题讨论】:

  • 使用块操作。

标签: ios multithreading swift


【解决方案1】:

您可以使用 NSBlockOperation 来包装一个块,如下所示:

    let operationQueue = NSOperationQueue()

    let operation1 = NSBlockOperation {
        // body of function 1
    }

    let operation2 = NSBlockOperation {
        // or call function 2
    }

    operation2.addDependency(operation1)

    operationQueue.addOperation(operation1)
    operationQueue.addOperation(operation2)

另外,您可以直接将块入队:

    operationQueue.addOperationWithBlock {
        // body of function 3
    }

缺点是您无权访问该操作,因此无法设置依赖项。

【讨论】:

  • 谢谢!当您在那里编写“addDependency”时,我没有得到无法设置依赖项的部分。你能再解释一下吗?
  • 当这三个函数本身是异步的时,这种方法将不起作用。
  • @Kahsn - 他的观点是,如果您使用 addOperationWithBlock,则不能使用依赖项(因为 addOperationWithBlock 创建操作并将其添加到队列中,但永远不会返回您需要的 NSOperation 引用对于addDependency)。但是如果你使用NSBlockOperation,它可以正常工作(但前提是函数同步运行)。
【解决方案2】:

当您的函数本身执行异步操作时,为了使依赖项能够正常工作,您必须:

  • 子类NSOperation;

  • 确保asynchronous 属性返回true;和

  • 执行必要的isExecutingisFinished KVO。

此外,在实现异步操作时,您还应该:

  • 实施取消逻辑,不仅可以将操作标记为已完成,还可以停止任何可能正在进行的请求。

有关NSURLSession 的并发/异步操作示例,请参阅https://stackoverflow.com/a/27022598/1271826。此处概述的原则也适用于此。

【讨论】:

    猜你喜欢
    • 2013-09-23
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多