从Swift 4

时间:2017-10-20 23:41:31

标签: ios swift multithreading

我正在后台线程上做一些沟通工作,我这样开始:

    self.thread = Thread(target: self, selector: #selector(threadMain), object: nil)
    self.thread?.start()

...

    func threadMain() {
       ...
    }

正确调用threadMain,处理按原样进行滚动。 threadMain上的最后一个代码序列是通过外部提供的回调“onComplete”通知主线程,我想这样做:

    print("leaving thread")
    DispatchQueue.main.async {
       self.onComplete?(CommunicationCallbackParams(errorCode: 
            self.errorCode, commState: self.commState, redirectUrl: self.redirectUrl))
    }

但是,从不调用闭包内的代码。如果我删除“DispatchQueue.main.async”包装它可以工作,但我在非UI线程级别上通知。这里可能出现什么问题?

同样的原则在目标C中正常工作......

2 个答案:

答案 0 :(得分:0)

最明显的是你使用可选链接调用self.onComplete。如果onComplete为nil,则不会调用该代码。但是,如果你没有将它包装在 text = "jsoihj a125847 asf" Dim s as String = text Like "*a######*" 的调用中,你会说它会被调用。

答案 1 :(得分:0)

哦,找到了解决方案。我使用信号量从XCTest调用类来等待结果:

    let semaphore = DispatchSemaphore.init(value:0)
    let _ = Communication(url: "<some url>") { (result) in
        print("Current thread is main thread: \(Thread.isMainThread)")
        print(result)
        semaphore.signal()
    }
    semaphore.wait()

该信号量模式必须阻止通知。一旦我将其改为期望,它就运行良好。

    let exp = expectation(description: "\(#function)\(#line)")
    let _ = Communication(url: "<some url>") { (result) in
        print("Current thread is main thread: \(Thread.isMainThread)")
        print(result)
        exp.fulfill()
    }
    waitForExpectations(timeout: 60, handler: nil)