semaphore_wait_trap情况下的Coredata应用程序

时间:2016-08-11 08:29:25

标签: ios objective-c multithreading core-data

我正在维护适用于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

0 个答案:

没有答案