2017-10-20 49 views
-1

我做在後臺線程一些溝通工作,這是我開始像這樣:通報從後臺線程主UI線程在斯威夫特4

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線程級別。這裏可能會出現什麼問題?

同樣的原則在Objective C的工作正常...

+0

顯示'onComplete'屬性的定義。 –

+0

private var onComplete :((CommunicationCallbackParams) - >())? – decades

+0

而且它從所需的類初始化的構造中設置(URL theUrl:字符串;的onComplete:@escaping((CommunicationCallbackParams) - >())){ \t \t self.url = theUrl \t \t self.onComplete =的onComplete \t \t \t \t super.init() \t \t \t \t self.thread =螺紋(目標:自,選擇器:#selector(threadMain),對象:無) \t \t self.thread。開始(? ) \t} – decades

回答

0

最明顯的一點是,我們在調用具有可選的鏈接self.onComplete。如果onComplete爲零,則該代碼不會被調用。但是,如果您不打包給DispatchQueue.main.async,那麼您會說它確實被調用。

+0

正是。如果我刪除DispatchQueue.main.async包裝,它可以工作... – decades

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)