gpt4 book ai didi

multithreading - 在后台线程上的 NSBlockOperation 之后立即在主线程上运行一个 block

转载 作者:可可西里 更新时间:2023-11-01 00:23:48 27 4
gpt4 key购买 nike

在我的项目中,我使用 NSBlockOperation 在后台线程上运行一个操作:

var operationQueue = NSOperationQueue()
var iop = NSBlockOperation(block: { self.reloadSize() /*calculation...*/ })
operationQueue.addOperation(iop)

在后台线程中的计算完成后,我需要立即在 NSTableView 上调用:table.reloadData()。我会在同一个线程中执行此操作,但是,由于自动布局问题,必须在主线程中重新加载表格。我怎样才能跨两个线程实现这种异步关系?

最佳答案

两种可能的方法:

  1. 从 block 内部调度表的重新加载:

    let operationQueue = NSOperationQueue()
    let operation = NSBlockOperation() {
    self.reloadSize()
    ...
    dispatch_async(dispatch_get_main_queue()) { // or you can use NSOperationQueue.mainQueue().addOperationWithBlock()
    self.table.reloadData()
    }
    }
    operationQueue.addOperation(operation)

    或者只使用addOperationWithBlock:

    let operationQueue = NSOperationQueue()
    operationQueue.addOperationWithBlock() {
    self.reloadSize()
    ...
    dispatch_async(dispatch_get_main_queue()) { // or you can use NSOperationQueue.mainQueue().addOperationWithBlock()
    self.table.reloadData()
    }
    }
  2. 创建一个依赖于此操作的新操作:

    let operationQueue = NSOperationQueue()

    let operation = NSBlockOperation() {
    self.reloadSize()
    ...
    }

    let completionOperation = NSBlockOperation() {
    self.table.reloadData()
    }

    completionOperation.addDependency(operation)

    operationQueue.addOperation(operation)
    NSOperationQueue.mainQueue().addOperation(completionOperation)

就个人而言,我通常倾向于第一种方法,尽管后一种方法在更复杂的场景中更有用(例如,完成操作取决于许多其他操作)。

关于multithreading - 在后台线程上的 NSBlockOperation 之后立即在主线程上运行一个 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31081948/

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