2016-07-09 14 views
0

私は毎回レルムエンティティに6つのオブジェクトを挿入します。通知では、私は正しい挿入を取得します。しかし私は何も修正をしないので、修正値は予期せぬものです。レルム通知ブロックは未変更の値を返します

var listNotificationToken = listResults?.addNotificationBlock({ [weak self] (changes: RealmCollectionChange) in 
     guard let tableView = self!.myListTableView else { return } 
     switch changes { 
     case .Initial: 
      tableView.reloadData() 
      break 
     case .Update(_, let deletions, let insertions, let modifications): 
      print("Reload - \(deletions) - \(insertions) - \(modifications)") 
      tableView.beginUpdates() 
       for insertIndex in insertions { 
        tableView.insertSections(NSIndexSet(index: insertIndex), withRowAnimation: .Fade) 
       } 
       for deleteIndex in deletions { 
        tableView.deleteSections(NSIndexSet(index: deleteIndex), withRowAnimation: .Fade) 
       } 
       for reloadIndex in modifications { 
        tableView.reloadSections(NSIndexSet(index: reloadIndex), withRowAnimation: .Fade) 
       } 
       tableView.endUpdates() 
      break 
     case .Error(let error): 
      print("\(error)") 
      break 
     } 
    }) 

結果は以下の通りである。

Reload - [] - [0, 1, 2, 3, 4, 5] - [] 
Reload - [] - [6, 7, 8, 9, 10, 11] - [4, 5] 
Reload - [] - [12, 13, 14, 15, 16, 17] - [4, 5, 10, 11] 
Reload - [] - [18, 19, 20, 21, 22, 23] - [0, 1, 6, 7, 8, 9] 
Reload - [] - [24, 25, 26, 27, 28, 29] - [3, 23] 
Reload - [] - [30, 31, 32, 33, 34, 35] - [0, 1, 22] 
Reload - [] - [36, 37, 38, 39, 40, 41] - [0, 1, 22, 30, 31, 32, 33, 34, 35] 
Reload - [] - [42, 43, 44, 45, 46, 47] - [0, 1, 22, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41] 

これをデバッグするのに役立つのですか?

EDIT:

マイモデルクラス:

class TalksList: Object { 
dynamic var identifier : String? = nil 
dynamic var isSynced: Bool = true 
dynamic var talkType : String? = nil 
dynamic var title : String? = nil 

... 

    override static func primaryKey() -> String? { 
     return "identifier" 
    } 

    class func saveObjectsFromArray(rawArray: NSArray) { 
     let dbArray = [TalksList]() 

     for rawObject in rawArray { 
      let talkListObject = TalksList() 

      talkListObject.isSynced = true 
      talkListObject.identifier = rawObject["_id"] as? String 
      ... 
      dbArray.append(talkListObject) 
     }    

     try! realmInstance.write({ 
     realmInstance.add(dbArray, update: true) 
     }) 
    } 
+0

変更のコードを投稿できますか? – Idan

+0

関連するモデルクラスも共有できますか? – bdash

+0

@bdashモデルクラスを追加しました –

答えて

2

Realm.add(_:update:)は、既存のオブジェクトが同じ主キーで存在しない、または既存のオブジェクトが存在しない場合、修飾された場合に挿入されているオブジェクトをもたらします。コレクションの通知ブロックに表示されている変更は、既存のオブジェクトを変更するとRealm.add(_:update:)の結果として生成される可能性があります。

これは、オブジェクトが他の管理対象オブジェクトと持つリレーションシップにも適用されます。関連するオブジェクトにプライマリキーが定義されている場合は、すでに存在する場合にも更新されます。これにより、すでに関連しているオブジェクトが変更済みとしてマークされます。

+0

そうです。しかし時には、私が修正していなくても、私は通知を得る。 –

+1

オブジェクトを「変更しない」という意味を明確にすることはできますか?どのセーブデータを 'saveObjectsFromArray'メソッドに共有していないので、どの出力を期待するのかは分かりません。レルムに存在するオブジェクトと同一のオブジェクトのデータを渡すことは、まだ変更と見なされることに注意してください。そのような場合に通知したくない場合は、不必要な書き込みをしないでください。 – bdash

+0

私は主キーとして '識別子'を持っています。毎回、データベースにない固有の主キーを持つ6つの新しいオブジェクトを生成します。私はこれらの新しいオブジェクトを保存すると、私は予想通りに挿入通知を取得します。しかし、私は古い識別子を持つオブジェクトを追加していません。しかし、私はまだ変更の通知を受け取ります。 –

関連する問題