NSOperationQueue - 同步运行

时间:2016-05-10 20:59:03

标签: nsoperation nsoperationqueue

我需要进行一些API调用,并且我希望确保它们按照它们发出的顺序返回。这是发生这种情况的正确流程吗?

  1. 创建NSOperationQueue,将最大并发操作设置为1
  2. 为API创建URL字符串
  3. 创建NSOperation块,调用API调用方法,传递URL字符串
  4. 将NSOperation添加到NSOperationQueue
  5. 这是我感到困惑的地方。将最大并发操作设置为1实质上使NSOperationQueue成为同步队列,一次只调用1个操作。但是,每个操作都将进行NSURLSession调用,这是异步的。在完成第一个操作之前,如何确保下一个操作不会运行? (完成后我想将返回的JSON存储在NSArray中,将每个额外返回的JSON添加到该数组中)。

1 个答案:

答案 0 :(得分:0)

确保NSOperation按顺序运行的正确方法是添加依赖项。依赖关系很强大,因为它们允许在不同队列上排序不同的操作。您可以在后台队列上进行API调用或数据处理;完成后,依赖操作可以更新主线程上的UI。

let operation1 = NSBlockOperation { 
    print("Run First - API Call")
}

let operation2 = NSBlockOperation { 
    print("Run Second - Update UI")
}
operation2.addDependency(operation1)

let backgroundQueue = NSOperationQueue()
backgroundQueue.addOperation(operation1)
NSOperationQueue.mainQueue().addOperation(operation2)

// operation1 will finish before operation2 is called, regardless of what queue they're in

请在addDependency NSOperation maxConcurrentOperationCount = 1点上查看Apple文档:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSOperation_class/index.html#//apple_ref/occ/cl/NSOperation

另外,请注意假设@Configuration @EnableJdbcHttpSession // default session length and DB table name can be included on the annotation public class SessionConfiguration { // code goes here if needed } 完成所有操作,确保一次只运行1个操作。这不能确保队列的顺序。优先级较高的操作可能会先运行。