块没有真正执行?

问题描述:

我想使用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() 
} 
+0

这是我第一次尝试的方式,它是行不通的。它不用括号编译。我想我需要将它分配给除Any以外的任何类型。我会继续努力,采取这种方法。 –

+0

注意我的演员到闭幕。如果你这样做,那么'block()'语法就可以工作。 – Rob

+0

我错过了,它的工作原理!谢谢。 :) –