2016-07-21 1 views
4

RealmSwift의 목록에 중복을 추가하지 않으려면 어떻게해야합니까?RealmSwift 목록에서 중복을 방지하려면 어떻게합니까?

realm 객체로 내 User이 있지만 실제 데이터 소스는 서버입니다 (단순히 Realm을 사용하여 로컬 사용자를 캐싱합니다). 내 서버에서 현재 사용자 데이터를 가져올 때, 영역에 저장된 사용자가 서버의 모든 재생 목록을 갖고 있는지 확인하고 싶습니다 (트랙의 동기화 목록 등). 나는 서버의 목록을 반복하여 myUser.playlists에 추가하면 사용자의 재생 목록에 여러 번 동일한 재생 목록이 추가 될 수 있다고 걱정됩니다.

class User: Object { 
     
    dynamic var name = "" 
    dynamic var id = "" 
    let playlists = List<Playlist>() 
    override class func primaryKey() -> String { 
        return "id" 
    } 
} 

class Playlist: Object { 
     
    dynamic var name = "" 
    dynamic var id = "" 
    let tracks = List<Song>() 
    override class func primaryKey() -> String { 
        return "id" 
    } 
} 

class Song: Object { 
     
    dynamic var title = "" 
    let artists = List<Artist>() 
    dynamic var id = "" 
    override class func primaryKey() -> String { 
        return "id" 
    } 
} 

class Artist: Object { 
    dynamic var name = "" 
    dynamic var id = "" 
    override class func primaryKey() -> String { 
        return "id" 
    } 
} 

답변

6

서버에서 오는 데이터의 종류에 따라 다릅니다. 전체 재생 목록 데이터가 항상 올 경우 (기존 재생 목록 데이터를 언제든지 바꿀 수 있음) 목록을 비우고 추가 할 수 있습니다.

realm.write { 
    user.playlists.removeAll() // empty playlists before adding 

    for playlistData in allPlaylistData { 
     let playlist = Playlist() 
     ... 
     user.playlists.append(playlist) 
    } 
} 

서버로부터 차등 데이터 (일부 데이터도 복제 됨)가있는 경우 데이터가 이미 있는지 여부를 확인해야합니다.

realm.write { 
    for playlistData in allPlaylistData { 
     let playlist = Playlist() 
     ... 

     realm.add(playlist, update: true) // Must add to Realm before check 

     guard let index = user.playlists.indexOf(playlist) else { 
      // Nothing to do if exists 
      continue 
     } 
     user.playlists.append(playlist) 
    } 
}