Remote에서 변경이 일어날 가능성은 없으므로 Remote변경사항을 Local에 업데이트하는 부분은 배제하였다.
오프라인에서 추가/삭제/수정된 Project를 찾아서 Remote에서도 똑같이 추가/삭제/수정해주는 방식을 사용했다.
각 Project를 identify할 수 있는 ID 프로퍼티를 활용하였다.
let localIDSet = Set(localProjects.map { $0.id })
let remoteIDSet = Set(remoteProjects.map { $0.id })
Local - Remote
한 결과를let locallyAppendedIDSet = Set(localIDSet).subtracting(Set(remoteIDSet))
let locallyAppendedProjects = localProjects.filter {
locallyAppendedIDSet.contains($0.id)
}
Remote - Local
한 결과를let deletedIDSet = remoteIDSet.subtracting(localIDSet)
let locallyDeletedProjects = remoteProjects.filter {
deletedIDSet.contains($0.id)
}
Remote와 Local의 교집합
부분은 둘다 동일하게 가진 ID들로써 수정이 일어나지 않았거나, 수정이 일어난 ID들이다.let intersectingIDSet = localIDSet.intersection(remoteIDSet)
let intersectingLocalProjects = localProjects.filter {
intersectingIDSet.contains($0.id)
}
let intersectingRemoteProjects = remoteProjects.filter {
intersectingIDSet.contains($0.id)
}
intersectingRemoteProjects.flatMap { remoteProject in
intersectingLocalProjects.filter { localProject in
localProject.updatedAt > remoteProject.updatedAt
}
}