块没有真正执行?
问题描述:
我想使用NSThread的子类来运行一些命令。在您推荐NSOperation或GCD之前,是的,我需要使用线程。块没有真正执行?
下面是我的代码和我的输出。该块正在创建并添加到数组中,据推测该数组正在出队并由该线程运行,但我没有看到由块运行产生的任何输出。为什么不?
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()
,例如:
if let block = _blocks.first as?()->() {
_blocks.removeFirst()
_lock.unlock()
print("running block...")
block()
}
这是我第一次尝试的方式,它是行不通的。它不用括号编译。我想我需要将它分配给除Any以外的任何类型。我会继续努力,采取这种方法。 –
注意我的演员到闭幕。如果你这样做,那么'block()'语法就可以工作。 – Rob
我错过了,它的工作原理!谢谢。 :) –