2017-05-24 79 views
0

這不是一個問題,而只是一個關於如何在後臺線程中發生更改時調度域收集更改通知的常見問題。領域刪除對象的策略和通知

因此,有一個場景(在領域可可):

  1. Foo: RLMObject類的對象RLMResults是默認領域牽強。然後該列表被轉換爲陣列[Foo]和在視圖控制器保存爲變量(無關緊要)
  2. 表顯示的foo該對象列表
  3. 某些對象上後臺線程
  4. 用戶滾動表視圖,小區中刪除被重用,索引x處的數組對象被訪問,但它在後臺線程上被刪除併發生崩潰,因爲object was deleted or invalidated。如預期。

爲了解決我們可以使用收集通知並在發生更改時刷新列表。由於我試圖按預期工作,但是在主線程發出通知之前,不可能發出單元重用的調度,以便單元設置方法將使用失效的對象?

試圖儘可能詳細地解釋問題。

主要是關於數據與服務器同步(不使用Realm的移動平臺)時發生在後臺線程和視圖上的情況,無論它們是表格單元格還是任何其他視圖,都持有對could-被刪除的對象。在嘗試對對象執行某些操作時檢查對象是否失效是一種很好的做法,因爲它可能會在後臺線程上被刪除。

我看到一對夫婦的解決方案:

  • 每次訪問RLMObject子類對象檢查的參考,如果它不被無效
  • 包裝對象到視圖模型(離開自我更新的所有好的部分模型特徵),然後在嘗試更改模型時留下另外兩種解決方案:
    • 將對象ID保存在視圖模型中,以便在嘗試更改時可以再次獲取對象
    • 必須具有相同的問題第一點

什麼是這個建議的對象本身的引用?

編輯:

使用ResultsList有時不是真的有可能,如果對象Foo是複雜的。例如,當打開Foo表視圖的詳細信息屏幕時,許多不同的單元訪問Foo類的對象的屬性。所以關於刪除對象屏幕的通知可能會被駁回,但作爲用戶滾動不可能該單元可能訪問無效的對象?

也許問題只是愚蠢的,在設計有關加薪的條件,但我很好奇,如果有可能,它能將在主線程會發生這樣的:object becomes invalidated (I don't know how that happens in realm internally>然後some code which access that object然後notification about invalidated object

回答

0

名單則轉換成陣列[Foo]並保存爲視圖控制器中的變量(無關緊要)

爲什麼要這樣做?這迫使Results中的每個對象都被物化到內存中,創建Swift級別的對象訪問器,並從磁盤讀取一些數據庫數據(可能很昂貴)。所有Realm系列均符合Swift標準庫的CollectionType協議,這意味着它的行爲與其他集合(如Array)已相同。將所有Results元素複製到Array中也意味着該陣列將快速與其基礎數據不同步,因爲Array不會自動更新,不像Results

這很容易解釋爲什麼您複製到Array中的一些Realm對象被刪除,這會導致對象失效,這意味着任何後續訪問都違反了Realm的API。長話短說,請勿複製Results,List或任何其他Realm集合到Array

+0

感謝您的回答。是的,我知道Realm如何使用mmap,但有時表視圖顯示單個對象,請參閱編輯該問題。 –

+0

我讀過你的編輯,而且我仍然不明白爲什麼你喜歡複製'List'中的所有數據,或者'Foo'很複雜時,'Results'有幫助。 – jpsim

+0

我不是在談論這個列表,我正在談論表格視圖中的一個'Foo'對象顯示。就像表格源文件引用單個'Foo'對象並按行顯示它的細節一樣。 –