Throw NSRangeException from NSFetchedResultsController.performFetch after introducing UICollectionViewDiffableDataSource

I was able to avoid NSInternalInconsistencyException by using

NSDiffableDatasource with NSFetchedResultsController

My data source definition is

private typealias DataSource = UICollectionViewDiffableDataSource<Int, NSManagedObjectID>

(Does anyone know why we should use Int as SectionIdentifierType? I find it works fine too, if I am using String as SectionIdentifierType)

Even though I do not see NSInternalInconsistencyException anymore, I have the following crash log from Firebase Crashlytics. Do you know how to fix that?

Fatal Exception: NSRangeException
0  CoreFoundation                 0x99288 __exceptionPreprocess
1  libobjc.A.dylib                0x16744 objc_exception_throw
2  CoreFoundation                 0x1a4318 -[__NSCFString characterAtIndex:].cold.1
3  CoreFoundation                 0x928c8 -[NSArray subarrayWithRange:]
4  CoreData                       0x702dc -[_PFArray subarrayWithRange:]
5  CoreData                       0xc2d58 -[_NSDefaultSectionInfo objects]
6  CoreData                       0x14eb98 -[NSFetchedResultsController _conditionallyDispatchSnapshotToDelegate:updatesInfo:]
7  CoreData                       0xc3edc -[NSFetchedResultsController performFetch:]

My NSFetchedResultsController look as following

private lazy var fetchedResultsController: NSFetchedResultsController<NSPlainNote> = {
    
    let fetchRequest: NSFetchRequest<NSPlainNote> = NSPlainNote.fetchRequest(
        label: label,
        propertiesToFetch: ["pinned"]
    )
    
    let controller = NSFetchedResultsController(
        fetchRequest: fetchRequest,
        managedObjectContext: CoreDataStack.INSTANCE.viewContext,
        sectionNameKeyPath: "pinned",
        cacheName: nil
    )
    
    controller.delegate = fetchedResultsControllerDelegate
    
    return controller
}()

My NSPlainNote.fetchResult looks as following

static func fetchRequest(label: String?, propertiesToFetch: [Any]?) -> NSFetchRequest<NSPlainNote> {
    let fetchRequest = NSPlainNote.fetchRequest()
    
    fetchRequest.propertiesToFetch = propertiesToFetch
    
    fetchRequest.sortDescriptors = [
        NSSortDescriptor(key: "pinned", ascending: false),
        NSSortDescriptor(key: "order", ascending: true)
    ]
    
    if let label = label {
        let predicate = NSPredicate(format: "archived = false AND trashed = false AND label = %@", label)
        fetchRequest.predicate = predicate
    } else {
        let predicate = NSPredicate(format: "archived = false AND trashed = false")
        fetchRequest.predicate = predicate
    }
    
    return fetchRequest
}

I am not able to reproduce the problem.

However, we can observe crash happens during NSFetchedResultsController.performFetch.

For those who are experience in this, do you know what is the root cause, and how I can resolve such?

Thanks.

Throw NSRangeException from NSFetchedResultsController.performFetch after introducing UICollectionViewDiffableDataSource
 
 
Q