Vì vậy mà tôi không chôn dấu, tôi sẽ mở câu hỏi cốt lõi của mình: tại sao mảng fetchedObjects của NSFetchedResultsController thường là đồng nhất, nhưng trong những dịp hiếm hoi có chứa __NSCFString
trong số các đối tượng được quản lý phải chứa?tại sao mảng fetchedObjects của NSFetchedResultsController không phải lúc nào cũng đồng nhất
Tôi có một ứng dụng đã được sản xuất trong một thời gian dài. Đó là chế độ xem chính là chế độ xem bảng chứa danh sách video, được hỗ trợ bởi các đối tượng được quản lý dữ liệu lõi. Bộ điều khiển xem bảng sử dụng một NSFetchedResultsController
cấu hình với một khá bình thường NSFetchRequest
:
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:[ABCVideo entityName]];
NSString *sectionKeyPath = nil;
request.fetchBatchSize = 20;
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:ABCVideoAttributes.recordingDate ascending:NO];
sectionKeyPath = @"sectionIdentifier";
request.sortDescriptors = @[sort];
request.predicate = [NSPredicate predicateWithFormat:@"owner = %@ and %K = %@", person, ABCVideoAttributes.serverDeleted, @(NO)];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:moc sectionNameKeyPath:sectionKeyPath cacheName:kABCMyVideosTableViewControllerCacheKey];
Kể từ khi những đoạn phim này có thể được tải vào trong đám mây, điều khiển xem bảng này được thông báo thường xuyên để cập nhật thanh tiến trình trong các tế bào xem bảng tương ứng với video hiện đang được tải lên. Bên trong cuộc gọi lại này, chúng tôi đang nhận mảng fetchedObjects
của NSFetchedResultsController
để tìm video tương ứng với thông báo, để ô xem bảng chính xác có thể cập nhật thanh tiến trình của nó.
Tất cả đều hoạt động. 99,9% thời gian, nó hoạt động mỗi lần </RonBurgundy>
.
Nhưng tôi nhận thấy trong báo cáo sự cố HockeyApp của chúng tôi rằng có một hiếm, trường hợp hiếm hoi mà tôi đã nhận được một SIGABRT điều đó xảy ra khi xử lý thông báo tôi đang cố gắng để có được một filteredArrayUsingPredicate
từ fetchedObjects
:
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSCFString 0x136f24480> valueForUndefinedKey:]: this class is not key value coding-compliant for the key guid.'
Gần đây, tôi đã tìm được một trường hợp mà thỉnh thoảng tôi có thể tái tạo vụ tai nạn này, và sau rất nhiều thử nghiệm, tôi phát hiện ra rằng mảng fetchedObjects
đôi khi chứa một thứ không phải là ABCVideo
: thay vào đó, một vị trí trong mảng bị chiếm bởi một __NSCFString
bản sao. Điều này khá đáng ngạc nhiên, với điều kiện NSFetchRequestResultType
là NSManagedObjectResultType
và một chuỗi không phải là đối tượng được quản lý.
Vì vậy, tôi tự hỏi: đây có phải là lỗi về Dữ liệu cốt lõi không? Hoặc mảng của tôi có chứa một con trỏ trước đây đã trỏ đến một cá thể ABCVideo
đã được deallocated và vị trí đó trên heap sau đó đã được thực hiện bởi một cá thể __NSCFString
? Nếu đó là sau này, thì làm thế nào điều này có thể xảy ra? Tôi đang sử dụng ARC, do đó, thật khó để hiểu cách một trong các video này có thể bị phân phối lại.
Tôi nghi ngờ lỗi Lõi dữ liệu. iOS9 đã giới thiệu một số lỗi, đặc biệt là với NSFetchedResultsControllers, và điều này có thể khác. – Avi
Bản thân mảng nên giữ lại các đối tượng của nó, trừ khi bạn bằng cách nào đó 'giải phóng' một quá nhiều, chúng không nên được giải phóng. Ngoài ra, với ARC, điều này gần như chắc chắn không phải là trường hợp. Có thể là lỗi ARC hoặc lỗi Lõi dữ liệu. Bạn có thể loại trừ điều này liên quan đến bộ nhớ đệm với 'NSFetchedResultsController' không? Vô hiệu hóa bộ nhớ đệm và tái tạo? – SmokeDispenser
Vì bạn có thể tái tạo nó, nó có thể hữu ích để phát hiện khi điều này xảy ra và kiểm tra nội dung của chuỗi. Tôi không biết tại sao chuỗi lại ở đó, nhưng nội dung của nó có thể hướng tới một nguyên nhân. –