我有一些需要同步的模型類。有一個Library
類型的主要對象,其中包含多個Album
對象(例如,想象一個音樂庫)。庫和專輯都通過執行NSCoding
協議來支持序列化。我需要對庫的修改與兩個類的相冊修改和序列化進行同步,以便我知道這些更新不會影響彼此的腳趾,並且我不會在更新過程中對對象進行序列化。使用GCD的遞歸同步
我以爲我只是通過所有的對象共享調度隊列,dispatch_async
所有的setter代碼和dispatch_sync
的獲得者。這是簡單和容易的,但它不工作,因爲程序流程是遞歸的:
// In the Library class
- (void) encodeWithCoder: (NSCoder*) encoder
{
dispatch_sync(queue, ^{
[encoder encodeObject:albums forKey:…];
});
}
// In the Album class, same queue as above
- (void) encodeWithCoder: (NSCoder*) encoder
{
dispatch_sync(queue, ^{
[encoder encodeObject:items forKey:…];
});
}
現在序列化庫觸發專輯系列化,因爲這兩種方法在同一個隊列,代碼死鎖使用dispatch_sync
。我已經看到這種模式:
- (void) runOnSynchronizationQueue: (dispatch_block_t) block
{
if (dispatch_get_current_queue() == queue) {
block();
} else {
dispatch_sync(queue, block);
}
}
它是否有意義,它會工作,是否安全?有更簡單的方法來完成同步嗎?
不是我希望聽到的答案,但一個很好的答案不過:)謝謝。 – zoul 2012-02-19 16:13:27