2017-02-10 60 views
2

我正在使用Realm,我將從不同的操作中獲取/設置領域對象的屬性,這些操作被添加到一個NSOperationQueue如何強制一個線程上運行NSOperationQueue?

假設在操作0中,我將領域對象的屬性設置爲一個新值,然後將操作1添加到相同的操作隊列,操作1獲取領域對象的屬性,可能會得到舊值,因爲線程運行操作1可能不同從操作0。

我該如何解決這個問題?任何建議將不勝感激。

回答

1

聽起來好像您需要保證operation1只有在operation0已成功完成設置Realm寫入事務後纔開始執行。

有2種方式,你可能會處理這個問題:

1.進行操作隊列序列。將隊列的maxConcurrentOperationCount屬性設置爲1,這樣即使您將操作同時添加到隊列中,也只會按照添加它們的順序執行。

2.使operation1依賴於operation0如果您需要保持操作隊列併發,則可以使用NSOperation.addDependency(_:)明確確保operation1僅在operation0完成後纔會開始。

operation1,請確保您您正在使用,以絕對確保你在operation0所做的更改已適當暴露在該隊列獲取你的域對象Realm對象調用refresh()

+0

如果線程中沒有runloop,'refresh'似乎不起作用。 – KudoCC

+0

'autorefresh'在線程中不起作用,因爲它依賴於runloop機制。 'refresh'在那裏顯式強制刷新。 – TiM

+0

哇,它的工作原理。謝謝你的幫助。順便說一句我在考慮使用NSThread來完成這項工作,因爲NSOperationQueue似乎使用了很多線程,即使我將maxConcurrentOperationCount設置爲1,如果每個線程都有一個快照,它必須消耗大量內存和Cpu時間。 – KudoCC

相關問題