2016-08-23 83 views
3

我有查詢Realm數據庫並列出其結果的UITableView視圖。該查詢包含各種過濾器和排序指令。如何在Swift中傳遞Realm結果?

當用戶選擇一個表項時,它們被帶到一個詳細視圖,允許他們向左或向右滑動來查看查詢中的前一個/下一個結果(按照它們出現在UITableView中的順序)。這個細節視圖是一個單獨的ViewController,我現在正在將結果傳遞給細節視圖控制器,以便它可以在它們之間來回移動。

這很好,直到引入刪除項目的能力。用戶可以刪除項目,我說用戶是因爲其他人可以刪除項目,並且刪除將傳播給所有用戶(通過互聯網)。現在,如果用戶已進入詳細信息視圖,並且某人遠程刪除了某個項目,則分配給詳細視圖的結果集現在不一致。即使表格視圖中的原始結果確實得到更新,它也不會更新。

我懷疑會發生這種情況,因爲該變量是由值而不是由引用。

當傳遞Realm對象時,推薦的做法是傳遞ID並再次執行查找,但涉及到結果時該怎麼辦?我應該把過濾/排序代碼放在一個UITableViewController和細節控制器都可以訪問的地方,以便它們都可以單獨提取結果嗎?或者,有沒有更好的辦法,我忽略了?

回答

1

如何在Swift中傳遞Realm結果?

您可以直接傳遞Results實例。它們按照Realm Swift文檔的Auto-Updating Results部分中的描述通過引用和自動更新傳遞。

您也可以傳遞NSPredicate或表示查詢的查詢字符串以避免Results固有的線程限制。

現在,如果用戶已進入詳細視圖,並且某人遠程刪除某個項目,那麼分配給詳細視圖的結果集現在不一致。即使表格視圖中的原始結果確實得到更新,它也不會更新。

除非我誤讀了你的文章(可能是這種情況),這種行爲是不正確的。如果Results所限制的線程有runloop(iOS上的主線程始終是這種情況),並且其父Realm已啓用autorefresh,則Results應始終反映它的Realm的最新狀態,這將是在每個runloop迭代之間的線程中自動進入最新狀態。

如果支持Results的查詢所引用的對象之一已被刪除,則Results將爲空,與其查詢爲FALSEPREDICATE時的行爲相同。

如果這與您所看到的行爲不匹配,那麼您可能在Realm中發現了一個錯誤,在這種情況下,我建議您使用file a GitHub issue以便Realm人員可以進行調查。