我正在使用Realm
,我將從不同的操作中獲取/設置領域對象的屬性,這些操作被添加到一個NSOperationQueue
。如何強制一個線程上運行NSOperationQueue?
假設在操作0中,我將領域對象的屬性設置爲一個新值,然後將操作1添加到相同的操作隊列,操作1獲取領域對象的屬性,可能會得到舊值,因爲線程運行操作1可能不同從操作0。
我該如何解決這個問題?任何建議將不勝感激。
我正在使用Realm
,我將從不同的操作中獲取/設置領域對象的屬性,這些操作被添加到一個NSOperationQueue
。如何強制一個線程上運行NSOperationQueue?
假設在操作0中,我將領域對象的屬性設置爲一個新值,然後將操作1添加到相同的操作隊列,操作1獲取領域對象的屬性,可能會得到舊值,因爲線程運行操作1可能不同從操作0。
我該如何解決這個問題?任何建議將不勝感激。
聽起來好像您需要保證operation1
只有在operation0
已成功完成設置Realm寫入事務後纔開始執行。
有2種方式,你可能會處理這個問題:
1.進行操作隊列序列。將隊列的maxConcurrentOperationCount
屬性設置爲1,這樣即使您將操作同時添加到隊列中,也只會按照添加它們的順序執行。
2.使operation1
依賴於operation0
。如果您需要保持操作隊列併發,則可以使用NSOperation.addDependency(_:)
明確確保operation1
僅在operation0
完成後纔會開始。
在operation1
,請確保您您正在使用,以絕對確保你在operation0
所做的更改已適當暴露在該隊列獲取你的域對象Realm
對象調用refresh()
。
如果線程中沒有runloop,'refresh'似乎不起作用。 – KudoCC
'autorefresh'在線程中不起作用,因爲它依賴於runloop機制。 'refresh'在那裏顯式強制刷新。 – TiM
哇,它的工作原理。謝謝你的幫助。順便說一句我在考慮使用NSThread來完成這項工作,因爲NSOperationQueue似乎使用了很多線程,即使我將maxConcurrentOperationCount設置爲1,如果每個線程都有一個快照,它必須消耗大量內存和Cpu時間。 – KudoCC