2016-05-13 95 views
2

當我的用戶註銷時,我用realm.deleteAll()清除了我的領域。在此之後,我收到很多通知,導致從Results對象中讀取,導致realm::Results::InvalidatedException「RLMResults已失效」的異常。我找不到方法如何檢查RLMResults是否失效?

  • 檢查Results對象直接失效;

  • 檢查Results'realm對象失效;或者

  • 得到ListResults是爲了檢查其失效狀態而得出的。

我想不出別的什麼東西去尋找。如果有更好的方法來清除數據庫,並且不會導致整個地方出現異常,我也很樂意聽到這個消息。

附加信息:即使在Results對象上調用count時,也會拋出異常,而不僅僅是訪問其對象。

+0

我覺得這是'Results' API不充分的情況下。你可以請[文件GitHub問題](https:// github。com/realm/realm-cocoa/issues/new)提到這個缺陷? – bdash

+0

提交https://github.com/realm/realm-cocoa/issues/3579。謝謝,@bdash –

回答

0

您可以檢查第一物體存在,從斯威夫特文檔:

public var first: T? { return rlmResults.firstObject() as! T? } 

如果爲空返回結果的第一個對象,或爲零。

從JAVA領域的文檔(無法找到斯威夫特文檔同樣的措辭):

注意到一個RealmResults永遠不能爲null不是即使在它不包含任何對象的情況。您應該始終使用size()方法來檢查RealmResults是否爲空。

長話短說,檢查第一個對象是否存在或嘗試對元素進行計數。

來源:

Java - Class RealmResults

Swift - Results Class Reference

編輯:這裏是一個代碼示例,它是從境界例如採取和修改,以我的需求,他們使用的通知令牌來檢測是否陣列是空的

class Record: Object { 
    dynamic var workoutName = "" 
    dynamic var totalTime = "" 
    dynamic var date   = "" 
} 
    let realm = try! Realm() 
    let array = try! Realm().objects(Record).sorted("date") 

    var notificationToken: NotificationToken? 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    setupUI() 

    // Set results notification block 

    notificationToken = array.addNotificationBlock { [weak self] (changes: RealmCollectionChange) in 
     guard let tableView = self?.tableView else { return } 
     switch changes { 
     case .Initial: 
     // Results are now populated and can be accessed without blocking the UI 
     tableView.reloadData() 
     break 
     case .Update(_, let deletions, let insertions, let modifications): 
     // Query results have changed, so apply them to the UITableView 
     tableView.beginUpdates() 
     tableView.insertRowsAtIndexPaths(insertions.map { NSIndexPath(forRow: $0, inSection: 0) }, 
      withRowAnimation: .Automatic) 
     tableView.deleteRowsAtIndexPaths(deletions.map { NSIndexPath(forRow: $0, inSection: 0) }, 
      withRowAnimation: .Automatic) 
     tableView.reloadRowsAtIndexPaths(modifications.map { NSIndexPath(forRow: $0, inSection: 0) }, 
      withRowAnimation: .Automatic) 
     tableView.endUpdates() 
     break 
     case .Error(let error): 
     // An error occurred while opening the Realm file on the background worker thread 
     fatalError("\(error)") 
     break 
     } 
    } 
    } 

我也清除表格u唱deleteAll():

func clearTable() { 
    try! realm.write { 
     realm.deleteAll() 
    } 
    } 
+0

調用'Results'對象上的'count'時會發生異常,所以我不認爲就是這樣。 –

+0

同樣,我不是在尋找空的,我正在尋找無效。當通知觸發時,我重新加載我的表格視圖,而不管其中的內容;檢查'count'會引發異常。 –