前一篇文章《iOS開機廣告實現(xiàn)》里面第二種獲取廣告數(shù)據(jù)的方法有一個困難需要克服就缆,就是如果在主線程睡眠時間內(nèi),子線程已經(jīng)下載好廣告數(shù)據(jù)竭宰,這時要主動喚醒主線程份招,也就是線程喚醒的問題。
對于線程問題脾还,網(wǎng)上大部分都是開辟子線程及線程睡眠的文章,卻幾乎沒有如何手動喚醒線程的文章。最終嗤谚,在一篇博客里面看到了一種解決方案,那就是NSCondition巩步。
NSCondition
NSCondition的方法很少,只有如下的幾個:
@available(iOS 2.0, *)
public class NSCondition : NSObject, NSLocking {
public func wait()
public func waitUntilDate(limit: NSDate) -> Bool
public func signal()
public func broadcast()
@available(iOS 2.0, *)
public var name: String?
}
通過wait()
和waitUntilDate(limit: NSDate) -> Bool
這兩個方法都可以實現(xiàn)線程阻塞即線程睡眠椅野,不同之處在于wait()
會使線程一直處于休眠狀態(tài),直到收到signal()
為止离福;而waitUntilDate(limit: NSDate) -> Bool
在使線程睡眠的同時會設(shè)置睡眠的終止時間,如果在終止時間前收到了signal()
就會喚醒線程妖爷;當(dāng)?shù)竭_(dá)終止時間的時候,即使沒有收到signal()
絮识,也會直接喚醒線程,而不會像wait()
方法那樣一直睡眠下去次舌。相關(guān)代碼如下所示:
/// 阻塞線程獲取廣告信息
private var condition = NSCondition()
/// 獲取廣告信息總時間(程序阻塞最長時間)
private var totalTimeForGettingAd: Double = 6
//MARK: - 阻塞及喚醒
//阻塞當(dāng)前線程
func blockedCurrentThread() {
//阻塞線程兽愤,如果規(guī)定時間內(nèi)還未完成獲取彼念,則繼續(xù)
let finalDate = NSDate(timeIntervalSinceNow: totalTimeForGettingAd)
condition.lock()
condition.waitUntilDate(finalDate)
condition.unlock()
}
//喚醒阻塞的線程烹看,與blockedCurrentThread配套使用
func invokeThread() {
condition.lock()
condition.signal()
condition.unlock()
}