我正在维护适用于iOS 9.3的iPad CoreData应用程序并且存在很多冻结问题。
该应用程序使用线程并适用于iOS 8.2(以及iOS10beta!) 线程16阻塞线程1
我想知道这是什么以及为什么会发生这种情况以及是否有解决方法?
欢迎任何帮助。
- (void)postRequestDoneNotification
{
// Perform one save to rule them all...
__weak typeof(self) weakSelf = self;
[[KKPDataManager sharedManager] saveContext:self.backgroundContext andWriteToDisk:YES withCompletionHandler:^(NSError *error) {
__strong typeof(weakSelf) strongSelf = weakSelf;
if (strongSelf) {
// Post notifications for objects done changing
if (strongSelf.updatedAnimals && ([strongSelf.updatedAnimals count]>0)) {
[strongSelf.updatedAnimals enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
[strongSelf performSelectorOnMainThread:@selector(sendAnimalDidChangeNotification:) withObject:obj waitUntilDone:NO];
}];
}
// Notify any observers
[strongSelf performSelectorOnMainThread:@selector(sendKKPServerRequestDoneNotification:) withObject:kNSNotificationKKPAnimalRequestDone waitUntilDone:NO];
}
}];
}
- (void)saveContext:(NSManagedObjectContext *)context andWriteToDisk:(BOOL)writeToDisk withCompletionHandler:(void (^)(NSError *error))completionBlock
{
__weak typeof(self) weakSelf = self;
if (context == self.writerManagedObjectContext) {
if (writeToDisk) {
[context performBlockAndWait:^{
[weakSelf saveContext:context andWait:YES withCompletionHandler:completionBlock];
}];
}
} else {
void (^saveContextBlock) () = ^{
// Save MOC and push changes up one level.
[weakSelf saveContext:context andWait:YES withCompletionHandler:^(NSError *error) {
__strong typeof(self) strongSelf = weakSelf;
if (!strongSelf) {
[LogUtil logWithSeverity:LogLevelError messageWithFormat:@"KKPDataManager instance was removed! Cannot save context."];
} else if (!error) {
if (writeToDisk && context.parentContext) {
// Continue saving parent contexts until the writer MOC has been reached
[strongSelf saveContext:context.parentContext andWriteToDisk:writeToDisk withCompletionHandler:completionBlock];
}
} else {
// Don't forget to execute the completion block!
if (completionBlock) {
completionBlock(error);
} else if (error) {
// No completion block; just send any errors to the log
NSMutableString *logMessage = [NSMutableString stringWithFormat:@"Error: %@.", [error localizedDescription]];
NSError *underlyingError = [error.userInfo valueForKey:NSUnderlyingErrorKey];
if (underlyingError)
[logMessage appendFormat:@" Underlying error: %@ - %@", [underlyingError localizedDescription], [underlyingError userInfo]];
[LogUtil logWithSeverity:LogLevelError messageWithFormat:@"%@.", logMessage];
}
}
}];
};
[context performBlockAndWait:saveContextBlock];
}
}
这是回溯
* thread #1: tid = 0x485828, 0x04c504d6 libsystem_kernel.dylib`semaphore_wait_trap + 10, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
* frame #0: 0x04c504d6 libsystem_kernel.dylib`semaphore_wait_trap + 10
frame #1: 0x048d808c libdispatch.dylib`_dispatch_thread_semaphore_wait + 25
frame #2: 0x048d0415 libdispatch.dylib`_dispatch_barrier_sync_f_slow + 480
frame #3: 0x048d0224 libdispatch.dylib`dispatch_barrier_sync_f + 88
frame #4: 0x0336cbd2 CoreData`-[NSManagedObjectContext performBlockAndWait:] + 242
frame #5: 0x002104ca KKP-iPad`-[KKPDataManager saveContext:andWriteToDisk:withCompletionHandler:](self=0x7bf286e0, _cmd="saveContext:andWriteToDisk:withCompletionHandler:", context=0x7df07040, writeToDisk=YES, completionBlock=0xbff538f8) + 682 at KKPDataManager.m:322
frame #6: 0x00102270 KKP-iPad`-[RequestAnimal postRequestDoneNotification](self=0x7de0df40, _cmd="postRequestDoneNotification") + 272 at RequestAnimal.m:1340
frame #7: 0x036b3059 libobjc.A.dylib`-[NSObject performSelector:withObject:] + 70
frame #8: 0x02f0d5f8 Foundation`__NSThreadPerformPerform + 323
frame #9: 0x03b1de5f CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
frame #10: 0x03b13aeb CoreFoundation`__CFRunLoopDoSources0 + 523
frame #11: 0x03b12f08 CoreFoundation`__CFRunLoopRun + 1032
frame #12: 0x03b12846 CoreFoundation`CFRunLoopRunSpecific + 470
frame #13: 0x03b1265b CoreFoundation`CFRunLoopRunInMode + 123
frame #14: 0x0660a664 GraphicsServices`GSEventRunModal + 192
frame #15: 0x0660a4a1 GraphicsServices`GSEventRun + 104
frame #16: 0x01986eb9 UIKit`UIApplicationMain + 160
frame #17: 0x000c5baa KKP-iPad`main(argc=1, argv=0xbff548b8) + 138 at main.m:14
frame #18: 0x04918a25 libdyld.dylib`start + 1
thread #2: tid = 0x485847, 0x04c587de libsystem_kernel.dylib`kevent64 + 10, queue = 'com.apple.libdispatch-manager'
frame #0: 0x04c587de libsystem_kernel.dylib`kevent64 + 10
frame #1: 0x048dc034 libdispatch.dylib`_dispatch_mgr_invoke + 257
frame #2: 0x048dbd84 libdispatch.dylib`_dispatch_mgr_thread + 60
thread #6: tid = 0x48585c, 0x04c57d5e libsystem_kernel.dylib`__workq_kernreturn + 10
frame #0: 0x04c57d5e libsystem_kernel.dylib`__workq_kernreturn + 10
frame #1: 0x04c1c34b libsystem_pthread.dylib`_pthread_wqthread + 1289
frame #2: 0x04c19f56 libsystem_pthread.dylib`start_wqthread + 34
thread #8: tid = 0x48587a, 0x04c5049a libsystem_kernel.dylib`mach_msg_trap + 10, name = 'com.apple.NSURLConnectionLoader'
frame #0: 0x04c5049a libsystem_kernel.dylib`mach_msg_trap + 10
frame #1: 0x04c4f884 libsystem_kernel.dylib`mach_msg + 68
frame #2: 0x03b13d16 CoreFoundation`__CFRunLoopServiceMachPort + 214
frame #3: 0x03b130f6 CoreFoundation`__CFRunLoopRun + 1526
frame #4: 0x03b12846 CoreFoundation`CFRunLoopRunSpecific + 470
frame #5: 0x03b1265b CoreFoundation`CFRunLoopRunInMode + 123
frame #6: 0x040de036 CFNetwork`+[NSURLConnection(Loader) _resourceLoadLoop:] + 472
frame #7: 0x02f0feda Foundation`-[NSThread main] + 76
frame #8: 0x02fc52dc Foundation`__NSThread__start__ + 1346
frame #9: 0x04c1c780 libsystem_pthread.dylib`_pthread_body + 138
frame #10: 0x04c1c6f6 libsystem_pthread.dylib`_pthread_start + 155
frame #11: 0x04c19f7a libsystem_pthread.dylib`thread_start + 34
thread #9: tid = 0x48588e, 0x04c57726 libsystem_kernel.dylib`__select + 10, name = 'com.apple.CFSocket.private'
frame #0: 0x04c57726 libsystem_kernel.dylib`__select + 10
frame #1: 0x03b5d090 CoreFoundation`__CFSocketManager + 912
frame #2: 0x04c1c780 libsystem_pthread.dylib`_pthread_body + 138
frame #3: 0x04c1c6f6 libsystem_pthread.dylib`_pthread_start + 155
frame #4: 0x04c19f7a libsystem_pthread.dylib`thread_start + 34
thread #16: tid = 0x4859c9, 0x04c504d6 libsystem_kernel.dylib`semaphore_wait_trap + 10, queue = 'NSManagedObjectContext 0x7df07040'
frame #0: 0x04c504d6 libsystem_kernel.dylib`semaphore_wait_trap + 10
frame #1: 0x048d808c libdispatch.dylib`_dispatch_thread_semaphore_wait + 25
frame #2: 0x048d0415 libdispatch.dylib`_dispatch_barrier_sync_f_slow + 480
frame #3: 0x048d0224 libdispatch.dylib`dispatch_barrier_sync_f + 88
frame #4: 0x0336d16e CoreData`_perform + 206
frame #5: 0x0336fefa CoreData`-[NSManagedObjectContext(_NestedContextSupport) managedObjectContextDidUnregisterObjectsWithIDs:] + 74
frame #6: 0x03340816 CoreData`-[_PFManagedObjectReferenceQueue _processReferenceQueue:] + 2054
frame #7: 0x033f4f1e CoreData`__89-[NSManagedObjectContext(_NSInternalNotificationHandling) _registerAyncReferenceCallback]_block_invoke + 126
frame #8: 0x0336ccfa CoreData`developerSubmittedBlockToNSManagedObjectContextPerform + 202
frame #9: 0x048ee9cd libdispatch.dylib`_dispatch_client_callout + 14
frame #10: 0x048d263c libdispatch.dylib`_dispatch_queue_drain + 2227
frame #11: 0x048d1af0 libdispatch.dylib`_dispatch_queue_invoke + 570
frame #12: 0x048d47a7 libdispatch.dylib`_dispatch_root_queue_drain + 550
frame #13: 0x048d457a libdispatch.dylib`_dispatch_worker_thread3 + 115
frame #14: 0x04c1c25c libsystem_pthread.dylib`_pthread_wqthread + 1050
frame #15: 0x04c19f56 libsystem_pthread.dylib`start_wqthread + 34
thread #18: tid = 0x485e82, 0x04c57d5e libsystem_kernel.dylib`__workq_kernreturn + 10
frame #0: 0x04c57d5e libsystem_kernel.dylib`__workq_kernreturn + 10
frame #1: 0x04c1c34b libsystem_pthread.dylib`_pthread_wqthread + 1289
frame #2: 0x04c19f56 libsystem_pthread.dylib`start_wqthread + 34
thread #17: tid = 0x485e84, 0x04c57d5e libsystem_kernel.dylib`__workq_kernreturn + 10
frame #0: 0x04c57d5e libsystem_kernel.dylib`__workq_kernreturn + 10
frame #1: 0x04c1c34b libsystem_pthread.dylib`_pthread_wqthread + 1289
frame #2: 0x04c19f56 libsystem_pthread.dylib`start_wqthread + 34
thread #19: tid = 0x485e89, 0x04c57d5e libsystem_kernel.dylib`__workq_kernreturn + 10
frame #0: 0x04c57d5e libsystem_kernel.dylib`__workq_kernreturn + 10
frame #1: 0x04c1c34b libsystem_pthread.dylib`_pthread_wqthread + 1289
frame #2: 0x04c19f56 libsystem_pthread.dylib`start_wqthread + 34