Skip to the content.

NSDiffableDataSourceSnapshot의 몇가지 팁

NSDiffableDataSourceSnapshot에 대한 정보가 너무 부족해서 ~_~ 적는 글입니다. iOS 15.0 beta 8 SDK 기준입니다.

reload VS reconfigure

iOS 15.0에서 NSDiffableDataSourceSnapshotreconfigure라는 개념이 추가되었습니다. (문서)

// Reconfigures any existing cells for the items. Reconfiguring is more efficient than reloading an item, as it does not replace the
// existing cell with a new cell. Prefer reconfiguring over reloading unless you actually need an entirely new cell for the item.
- (void)reconfigureItemsWithIdentifiers:(NSArray<ItemIdentifierType>*)identifiers API_AVAILABLE(ios(15.0), tvos(15.0));

reload는 iOS 13.0 부터 있던 개념이기도 한데요. 이 둘의 차이점을 나열하자면

Cell Reuse

Exception

결론

iOS 15.0 미만에서는 어쩔 수 없이 reload를 써야 하지만, iOS 15.0 이상이라면 reconfigure를 쓰는게 좋습니다. 단, 위 조건에 부합하도록 설계해야 합니다.

Sort

이유를 모르겠으나 NSDiffableDataSourceSnapshot에서는 sort를 제공하지 않습니다. snapshot을 mutate 시킬려면 애플이 만들어놓은 method 안에서만 해야 해서, Swift/Objective-C에 내장된 Sort 함수를 쓸 수 없습니다.

그런 분들을 위해 제가 SortSnapshot라는 라이브러리를 만들었습니다. 아래는 제 개인 프로젝트에서 timestamp (NSDate) 순서대로 Item을 sort 시키는 코드입니다. 코드 몇줄만 써서 sort를 시킬 수 있습니다.

- (void)sortSnapshot:(NSDiffableDataSourceSnapshot *)snapshot {
    [snapshot ssSortItemsWithSectionIdentifiers:snapshot.sectionIdentifiers
                              usingComparator:^NSComparisonResult(DecksItemModel *obj1, DecksItemModel *obj2) {
        if ((obj1 == nil) || (obj2 == nil)) {
            return NSOrderedSame;
        }
        return [obj2.localDeck.timestamp compare:obj1.localDeck.timestamp];
    }];
}

isEqual, hash

NSObject에서는 isEqual:hash method를 제공합니다.

- (BOOL)isEqual:(id)object;
 
- (NSUInteger)hash;  

이 둘은 NSDiffableDataSourceSnapshot에서 Item을 비교할 때 쓰이지만, 어떨 때 isEqual:이 쓰이고, 어떨 때 hash가 쓰이지? 라는 의문이 생기더라고요. 이를 정리하면