2016-10-08 73 views
1

我試圖實現一個使用定時器的函數,並且在通過「URLSession.dataTask」的回調函數調用它時發現定時器沒有執行。在子任務的情況下不執行定時器

在下面的情況下,調用「被調用者」函數。

class TimerClass { 
    func caller() { 
     timer = Timer.scheduledTimer(timeInterval: 0.1, 
           target: self, 
           selector: #selector(callee), 
           userInfo: nil, 
           repeats: false) 
    } 
    func callee() { 
     print(「OK」) 
    } 
} 

class AnyClass { 
    func any() { 
     let timer:TimerClass=TimerClass() 
     timer.caller() 
    } 
} 

但是,在「callee」下方不會被調用。 (我已經確認「調用者」功能被執行)

class TimerClass { 
    func caller() { 
     timer = Timer.scheduledTimer(timeInterval: 0.1, 
           target: self, 
           selector: #selector(callee), 
           userInfo: nil, 
           repeats: false) 
    } 
    func callee() { 
     print(「OK」) 
    } 
} 

class AnyClass { 
    func any() { 
     func cb(data:Data?, response:URLResponse?, err:Error?) { 
      let timer:TimerClass=TimerClass() 
      timer.caller() 
     } 
     let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: cb) 
     . 
     . 
     . 
    } 
} 

我想也許是因爲它是由子任務執行的。
任何人都可以讓我知道如何更正代碼?

回答

0

檢查Timer class的參考:

  • 使用scheduledTimer(timeInterval:invocation:repeats:)scheduledTimer(timeInterval:target:selector:userInfo:repeats:)類 方法 默認模式來創建對當前運行的循環定時器和調度。

  • 使用init(timeInterval:invocation:repeats:)init(timeInterval:target:selector:userInfo:repeats:)類方法 創建計時器對象而無需在運行循環中調度它。 ( 創建它之後,你必須手動調用 相應RunLoop對象的add(_:forMode:)方法添加定時器運行循環。)

所以,如果要安排在主計時器RunLoop,你可以寫這樣的事情:

DispatchQueue.main.async { 
     Timer.scheduledTimer(
      timeInterval: 0.1, 
      target: self, 
      selector: #selector(self.callee), 
      userInfo: nil, 
      repeats: false 
     ) 
    } 

不使用Timer類,但這似乎更好:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { 
     self.callee() 
    } 

(修訂版)可以清楚地指出,RunLoop類一般不被認爲是線程安全的。你不應該使用舊的代碼(隱藏在編輯歷史中),即使它看起來在一些有限的條件下工作。

+0

謝謝你回答我的問題。這正是我想知道的,而且我的代碼已經成爲我想要的。 –

+0

@ Ken.Matushima,對不起,我完全忘記檢查'RunLoop'的線程安全性,並且清楚地表明**'RunLoop'類通常不被認爲是線程安全的**,所以請嘗試我更新的答案。 – OOPer

+0

謝謝你告訴我。我明白了。我會以另一種方式尋找。 –

相關問題