swift - block 没有真正执行?

标签 swift locking closures nsthread

我正在尝试使用 NSThread 的子类来运行一些命令。在您推荐 NSOperation 或 GCD 之前,是的,我需要使用线程。

下面是我的代码和输出。该 block 正在创建并添加到数组中,并且应该由线程出列并运行,但我没有看到 block 运行产生的任何输出。为什么不呢?

import UIKit

class ViewController: UIViewController {

    private let _queue = dispatch_queue_create("com.AaronLBratcher.ALBQueue", nil)
    private let _thread = TestThread()
    private let _lock = NSCondition()

    override func viewDidLoad() {
        super.viewDidLoad()

        _thread.start()

        var openSuccessful = false

        dispatch_sync(_queue) {[unowned self] () -> Void in
            self._lock.lock()
            self._thread.openFile("file path here", completion: { (successful) -> Void in
                print("completion block running...")
                openSuccessful = successful
                self._lock.signal()
                self._lock.unlock()
            })
            self._lock.wait()
        }

        print("open operation complete")
        print(openSuccessful)
    }


    final class TestThread:NSThread {
        var _iterations = 0
        var _lock = NSCondition()
        var _blocks = [Any]()

        func openFile(FilePath:String, completion:(successful:Bool) -> Void) {
            print("queueing openFile...")

            let block = {[unowned self] in
                self._iterations = self._iterations + 1
                print("opening file...")
                completion(successful: true)
            }

            addBlock(block)
        }

        func addBlock(block:Any) {
            _lock.lock()
            _blocks.append(block)
            _lock.signal()
            _lock.unlock()
        }

        override func main() {
            _lock.lock()
            while true {
                while _blocks.count == 0 {
                    print("waiting...")
                    _lock.wait()
                }

                print("extracting block...")
                if let block = _blocks.first {
                    _blocks.removeFirst()
                    _lock.unlock()
                    print("running block...")
                    block;
                }

                _lock.lock()
            }
        }
    }
}

输出:

queueing openFile...
waiting...
extracting block...
running block...
waiting...

最佳答案

该 block 未运行,因为您只有 block 。您需要 block(),例如:

if let block = _blocks.first as? ()->() {
    _blocks.removeFirst()
    _lock.unlock()
    print("running block...")
    block()
}

关于swift - block 没有真正执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33586410/

相关文章:

swift - 如何在 Swift 中制作日期格式化程序以仅显示日期的年份部分?

ios - 如何理解无意义的 Swift 堆栈跟踪?

c# - 如果内部发生异常,锁定的对象是否会保持锁定状态?

javascript - 函数一次接受回调作为输入并返回一个函数。

swift - 在 Xcode Storyboard中制作可重用组件

ios - 在 xcode 中的功能下找不到热点

c# - lock语句使用什么类型的锁定机制

c# - 如何在多线程上下文中使方法独占?

scala - 隐式参数未传递给闭包

循环内的 JavaScript 闭包 – 简单的实际示例