lede'yi gömmemek için temel sorumu açacağım: neden NSFetchedResultsController'ın fetchedObjects diziliminin genellikle homojen olduğu, ancak nadir durumlarda İçerdiği yönetilen nesneler arasında __NSCFString
?neden NSFetchedResultsController'ın fetchedObjects dizisi her zaman homojen değil
Ben uzun, uzun zamandır üretimde olan bir uygulama var. Birincil görünüm, temel veri yönetilen nesnelerin desteklediği bir video listesi içeren bir tablo görünümüdür. Tablo görünümü denetleyicisi ile yapılandırılmış bir NSFetchedResultsController
kullanan bir NSFetchRequest
oldukça sıradan: bu videolar bulutun içine yüklenebilir, bu tabloda görünümü denetleyicisi tablo görünümü hücreleri videoları tekabül ilerleme çubukları güncelleştirmek için zaman zaman bildirim alır
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];
Şu anda yükleniyor. Bu geri bildirimin içinde, bildirime karşılık gelen videoyu bulmak için NSFetchedResultsController
'un fetchedObjects
dizisini alıyoruz, böylece doğru tablo görüntüleme hücresi ilerleme çubuğunu güncelleyebilir.
Tüm bu çalışmalar. Zamanın% 99,9'u, her seferinde </RonBurgundy>
çalışır.
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSCFString 0x136f24480> valueForUndefinedKey:]: this class is not key value coding-compliant for the key guid.'
Ama benim bildirim işleyicisi fetchedObjects
bir filteredArrayUsingPredicate
almaya çalışırken ne olur bir SIGABRT başlamıştı nadir, nadir bir vaka olduğuna bizim HockeyApp kilitlenme raporlarında fark
Geçtiğimiz günlerde bu çökmeyi zaman zaman yeniden üretebileceğim bir durum bulmayı başardım ve çok fazla deneyden sonra, fetchedObjects
dizisinin bazen ABCVideo
olmayan bir şey içerdiğini keşfettim: bunun yerine dizideki bir yuva tarafından işgal edildi. __NSCFString
örneği. Bu, NSFetchRequestResultType
NSManagedObjectResultType
öğesinin verildiği ve bir dizenin yönetilen bir nesne olmadığı göz önüne alındığında oldukça şaşırtıcıydı.
Yani sol merak ediyorum: Bu bir çekirdek Veri hatadır? Veya dizimde önceden ayrılmış bir ABCVideo
örneğine işaret eden bir işaretçi var ve öbek üzerindeki bu konum daha sonra bir __NSCFString
örneğiyle alındı? Eğer ikincisiyse, bu nasıl olabilir? ARC kullanıyorum, bu nedenle bu videolardan birinin nasıl dağıtılabileceğini anlamak zor.
Çekirdek Veri hatası olduğundan şüpheleniyorum. iOS9, özellikle NSFetchedResultsControllers ile çeşitli hatalar getirdi ve bu da başka bir şey olabilir. – Avi
Dizinin kendisi, nesneleri birçoğunu '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ', aksi halde serbest bırakılmasınlar diye sürece saklamalıdır. Ayrıca, ARC ile, bu neredeyse kesinlikle böyle değil. Bir ARC hatası veya Çekirdek Veri hatası olabilir. Bunun, 'NSFetchedResultsController' ile önbelleğe almayla ilgili olduğunu biliyor musunuz? Önbelleğe almayı devre dışı bırak ve çoğalt? – SmokeDispenser
Yeniden üretebileceğinizden, bunun ne zaman olduğunu algılamak ve dizenin içeriğini incelemek yararlı olabilir. Dizenin neden orada olduğunu bilmiyorum, ancak içeriği bir nedene işaret edebilir. –