gpt4 book ai didi

multithreading - 难以理解 NSOperation 和 NSOperationQueue (swift)

转载 作者:行者123 更新时间:2023-11-30 14:07:44 25 4
gpt4 key购买 nike

我无法理解如何创建同步 NSOperationQueue。我创建了一个原型(prototype),基本上说:

  • 创建 4 个需要很长时间或很短时间才能完成的操作
  • 无论完成时间长短,它们都应该按照在队列中创建的顺序完成。

我的 NSOperation 类非常简单:

class LGOperation : NSOperation
{
private var operation: () -> ()
init(operation: () -> ())
{
self.operation = operation
}

override func main()
{
if self.cancelled {
return
}
operation()
}
}

我的测试类也很简单:

class LGOperationTest
{

class func downloadImage(url: String)
{
// This is a simple AFHTTPRequestOperation for the image
LGImageHelper.downloadImageWithUrl(url, complete: { (image: AnyObject?) in
println("downloaded \(url)")
})
}

class func test()
{
var queue = NSOperationQueue.mainQueue()
queue.maxConcurrentOperationCount = 1
var op1 = LGOperation(operation: { self.downloadImage("http://www.toysrus.com/graphics/tru_prod_images/Animal-Planet-T-Rex---Grey--pTRU1-2909995dt.jpg") })

var op2 = LGOperation(operation: { println("OPERATION 2") })

var op3 = LGOperation(operation: { self.downloadImage("http://www.badassoftheweek.com/trex.jpg") })

var op4 = LGOperation(operation: { println("OPERATION 3") })
var ops: [NSOperation] = [op1, op2, op3, op4]
op2.addDependency(op1)
op3.addDependency(op2)
op4.addDependency(op3)
op4.completionBlock = {
println("finished op 4")
}

queue.addOperation(op1)
queue.addOperation(op2)
queue.addOperation(op3)
queue.addOperation(op4)
println("DONE")
}
}

所以我希望这里的操作按顺序完成,而不是输出:

为什么我不能使网络请求与其他代码同步触发? (我知道我可以使用完成 block 并将它们链接起来,但我想弄清楚如何使用 NSOperation 来做到这一点)

最佳答案

操作队列用于调度异步操作,主要是这些操作可能长时间运行,并且您不希望阻塞当前(通常是 UI)线程。阻塞 UI 线程会导致 UI 无响应。

当您创建 4 个操作时,它们何时完成是执行操作的一个因素。在您的例子中,您有一些操作正在执行 println (速度非常快),并且您有一些操作正在从互联网下载(速度非常慢)。

操作队列的全部意义在于允许您异步触发这些操作,并且每当操作完成时,触发完成处理程序。

换句话说,您无法控制顺序。

如果你想控制顺序,我的建议是执行以下操作:

  1. 开始运行1
  2. 在操作 1 的完成处理程序中,启动操作 2
  3. 在操作 2 的完成处理程序中,启动操作 3
  4. 在操作 3 的完成处理程序中,启动操作 4

通过这种方式,您仍然可以获得操作队列的好处(不会阻塞 UI 线程),并且可以按顺序链接操作。

关于multithreading - 难以理解 NSOperation 和 NSOperationQueue (swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32150219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com