2016-08-02 10 views
0

アプリケーションのCrashlyticsコンソールで、多少のクラッシュが報告されています。libobjc.A.dylib t objc_msgSendクラッシュがバックグラウンドスレッドのコアデータ使用で発生しています

#11. Crashed: com.apple.root.default-qos 
0 libobjc.A.dylib    0x22f3fa86 objc_msgSend + 5 
1 Foundation      0x23ee3005 -[NSString caseInsensitiveCompare:] + 28 
2 Foundation      0x23ed10bd _NSCompareObject + 28 
3 Foundation      0x23ed109d _NSSortFunctionOne + 120 
4 CoreFoundation     0x2373e6a3 __CFSimpleMergeSort + 114 
5 CoreFoundation     0x2373e6c5 __CFSimpleMergeSort + 148 
6 CoreFoundation     0x2373e6d9 __CFSimpleMergeSort + 168 
7 CoreFoundation     0x2373e6c5 __CFSimpleMergeSort + 148 
8 CoreFoundation     0x2373e6d9 __CFSimpleMergeSort + 168 
9 CoreFoundation     0x2368ac35 CFSortIndexes + 404 
10 CoreFoundation     0x2368c241 CFMergeSortArray + 176 
11 Foundation      0x23ed0a9d _sortedObjectsUsingDescriptors + 456 
12 Foundation      0x23f9c9fb -[NSSet(NSKeyValueSorting) sortedArrayUsingDescriptors:] + 510 
13 MyApp       0x6d431 __24-[MyApp refresh]_block_invoke (MyApp.m:247) 
14 CoreFoundation     0x23769499 __NSArrayEnumerate + 372 
15 CoreFoundation     0x236e6c3b -[NSArray enumerateObjectsWithOptions:usingBlock:] + 62 
16 MyApp       0x6d17d -[MyApp refresh] (MyApp.m:263) 
17 MyApp       0xa97eb __52-[MyAppRequest updateAfterNotification:]_block_invoke (MyAppRequest.m:1175) 
18 libdispatch.dylib    0x23307cbf _dispatch_call_block_and_release + 10 
19 libdispatch.dylib    0x233136a1 _dispatch_root_queue_drain + 1572 
20 libdispatch.dylib    0x2331307b _dispatch_worker_thread3 + 94 
21 libsystem_pthread.dylib  0x234a6e0d _pthread_wqthread + 1024 
22 libsystem_pthread.dylib  0x234a69fc start_wqthread + 8 

クラッシュの他のインスタンスが(MyAppクラスのrefresh方法で)、異なる部分中に同じアプリケーションコードで発生する:私は、次のスレッドのスタックトレースをクラッシュしている多くの例の

つ方法ロジックのCoreFoundation sortedArrayUsingDescriptors。例えば、別のクラッシュの例のスタックトレースがありますリフレッシュで

0 libobjc.A.dylib    0x1823cdb90 objc_msgSend + 16 
1 CoreFoundation     0x182c42738 CFStringCompareWithOptionsAndLocale + 232 
2 Foundation      0x183644840 _NSCompareObject + 64 
3 CoreFoundation     0x182d150f4 __CFSimpleMergeSort + 196 
4 CoreFoundation     0x182d15124 __CFSimpleMergeSort + 244 
5 CoreFoundation     0x182d15124 __CFSimpleMergeSort + 244 
6 CoreFoundation     0x182d15124 __CFSimpleMergeSort + 244 
7 CoreFoundation     0x182d1513c __CFSimpleMergeSort + 268 
8 CoreFoundation     0x182d15124 __CFSimpleMergeSort + 244 
9 CoreFoundation     0x182d15124 __CFSimpleMergeSort + 244 
10 CoreFoundation     0x182d15124 __CFSimpleMergeSort + 244 
11 CoreFoundation     0x182c3b738 CFSortIndexes + 472 
12 CoreFoundation     0x182c3cf58 CFMergeSortArray + 220 
13 Foundation      0x1836440f8 _sortedObjectsUsingDescriptors + 564 
14 Foundation      0x183725120 -[NSSet(NSKeyValueSorting) sortedArrayUsingDescriptors:] + 564 
15 MyApp       0x10006f264 __24-[MyApp refresh]_block_invoke (MyApp.m:247) 

アプリのコードは次のとおりです。getProductsがある

​​

- (NSArray*)getProducts { 
    NSFetchRequest *productFetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Products"]; 

    // Filter 
    NSMutableArray *productsPredicates = [NSMutableArray array]; 
    [productsPredicates addObject:[NSPredicate predicateWithFormat:@"life_uid == %@", req.lifeUid]]; 
    [productsPredicates addObject:[NSPredicate predicateWithFormat:@"hidden == %@", @NO]]; 
    [productFetchRequest setPredicate:[NSCompoundPredicate andPredicateWithSubpredicates:productsPredicates]]; 

    // Sort 
    NSSortDescriptor *sortProductsByName = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; 
    [productFetchRequest setSortDescriptors:@[sortProductsByName]]; 

    [productFetchRequest setReturnsObjectsAsFaults:NO]; 
    [productFetchRequest setRelationshipKeyPathsForPrefetching:@[@"subprods", @"subprods.special"]]; 

    NSManagedObjectContext *moc = [MyAppCoreDataController sharedController].mainManagedObjectContext; 
    NSError *error = nil; 
    NSArray *products = [moc executeFetchRequest:productFetchRequest error:&error]; 
    if (error) { 
     NSLog(@"Error fetching products %@", error); 
    } 
    return products; 
} 

とリフレッシュがそうのように呼ばれている。

- (void)updateAfterNotification:(NSNotification *)notification { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     [[MyApp instance] refresh]; 
    }); 
} 

答えて

0

コアデータの並行性を正しく処理していない可能性が高いためです。 NSPrivateQueueConcurrencyTypeまたはNSMainQueueConcurrencyTypeを使用して管理対象オブジェクトコンテキストを作成する場合、で、すべてのコアデータアクセスをperformBlockまたはperformBlockAndWaitにコールする必要があります。フェッチされたオブジェクトの属性値にアクセスするだけでなく、取り出しも含まれます。

dispatch_asyncを使用していますが、これはCore Dataとの並行性を処理する正しい方法ではありません。 performBlockまたはperformBlockAndWaitに切り替える必要があります。

+0

おかげでトム、私は少しこのエリアで読んでみましょう。私はCore Dataで多くの経験を積んでおらず、見ているアプリケーションロジックを書かなかったので、これは比較的新しいものです。私は、(もし?)私は一般的にこのもののアイデアを持っているときにコメントします! – Zach

関連する問題