2

ユーザーからいくつかのクラッシュ レポートを受け取りました。私はこれをどこから始めるべきかさえ知りません。グループのリストから始まるテーブル ビューで、アセット ライブラリの画像を表示しています。(メイン スレッドで) 次のコードを使用してグループを読み込みます。

- (ALAssetsLibrary *)library {
    if (!_library) {
        _library = [[ALAssetsLibrary alloc] init];
    }

    return _library;
}

- (void)determineGroups {
    ALAssetsLibrary *lib = [self library];
    [lib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos | ALAssetsGroupPhotoStream | ALAssetsGroupFaces | ALAssetsGroupLibrary | ALAssetsGroupAlbum | ALAssetsGroupEvent usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
        if (group) {
            if (!_groups) {
                _groups = [[NSMutableArray alloc] init];
            }

            if ([group numberOfAssets]) {
                [group setAssetsFilter:[ALAssetsFilter allPhotos]];
                if ([[group valueForProperty:ALAssetsGroupPropertyType] isEqual:@(ALAssetsGroupSavedPhotos)]) {
                    [_groups insertObject:group atIndex:0];
                } else {
                    [_groups addObject:group];
                }
            }
        } else {
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.tableView reloadData];
            });
        }
    } failureBlock:^(NSError *error) {
        // denied
        dispatch_async(dispatch_get_main_queue(), ^{
            self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
            [self.tableView reloadData];
        });
    }];
}

テーブル ビューにデータを入力するときに、各グループの写真の数を表示したいと考えています。これを行うには、グループで「numberOfAssets」メソッドを呼び出します。

ほとんどの場合、これで問題なく動作しますが、まれにクラッシュすることがあります。関連情報を含むスタック トレースの 1 つを次に示します (メイン スレッドがグループ内のアセットの数を取得するためにビジー状態である間に、スレッド 5 がクラッシュしました)。

クラッシュしたスレッド: 5

アプリケーション固有の情報:
*** キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了します。理由: 'コンテキストが多すぎます。contextList にスペースがありません。

スレッド 0:
0 CoreFoundation 0x313a1c42 _CFStringGetLength2 + 26
1 CoreFoundation 0x313aba41 -[__NSDictionaryM objectForKey:] + 133
2 CoreData 0x312b5d2f -[NSSQLOrderIntermediate generateSQLStringInContext:] + 1283
3 CoreData 0x312018f7 -[NSSQLFetchIntermediate generateSQLStringInContext:] + 515
4 CoreData 0x311fe625 -[NSSQLGenerator newSQLStatementForFetchRequest:ignoreInheritance:countOnly:nestingLevel:] + 425
5 CoreData 0x311fe3ad -[NSSQLAdapter _newSelectStatementWithFetchRequest:ignoreInheritance:] + 509
6 CoreData 0x311fdfc5 -[NSSQLCore newRowsForFetchPlan:] + 117
7 CoreData 0x311fd73f -[NSSQLCore objectsForFetchRequest:inContext:] + 683
8 CoreData 0x311fd205 -[NSSQLCore executeRequest:withContext:error:] + 469
9 CoreData 0x311fc61d -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 1645
10 CoreData 0x311faf17 -[NSManagedObjectContext executeFetchRequest:エラー:] + 647
11 PhotoLibraryServices 0x366cd4e5 -[PLManagedObjectContext executeFetchRequest:エラー:] + 49
12 CoreData 0x3121ad07 _faultBatchAtIndex + 623
13 CoreData 0x3121aa53 -[_PFBatchFaultingArray getObjects:範囲:] + 143
14 CoreData 0x3121a9c1 -[_PFBatchFaultingArray getObjects:] + 41
15 Foundation 0x31cfbbe1 _filterObjectsUsingPredicate + 325
16 Foundation 0x31d01b8d -[NSArray(NSPredicateSupport)filteredArrayUsingPredicate:] + 273
17 PhotoLibraryServices 0x366d86ad +[PLFilteredAlbumfilteredIndexesInAlbum:述語:] + 265
18 PhotoLibraryServices 0x366d8bd1 -[PLFilteredAlbumfilteredIndexes] + 117
19 PhotoLibraryServices 0x366d8d75 -[PLFilteredAlbum countOfFilteredAssets] + 21
20 AssetsLibrary 0x30ce25d5 __31-[ALAssetsGroup numberOfAssets]_block_invoke_0 + 41
21 CoreData 0x31257fd1 developerSubmittedBlockToNSManagedObjectContextPerform + 89
22 libdispatch.dylib 0x3971d4b7 _dispatch_client_callout + 23
23 libdispatch.dylib 0x397219f7 _dispatch_barrier_sync_f_invoke + 31
24 CoreData 0x31258153 -[NSManagedObjectContext performBlockAndWait:] + 175
25 AssetsLibrary 0x30ce414f -[ALAssetsLibrary _performBlockAndWait:] + 135
26 AssetsLibrary 0x30ce8f59 -[ALAssetsGroupPrivate _performBlockAndWait:] + 177
27 AssetsLibrary 0x30ce254b -[ALAssetsGroup numberOfAssets] + 259

スレッド 5 がクラッシュしました:
0 libsystem_kernel.dylib 0x39804350 __pthread_kill + 8
1 libsystem_c.dylib 0x397b7973 中止 + 95
2 MyApp 0x0074685f ___lldb_unnamed_function30167$$MyApp + 27
3 CoreFoundation 0x3145b57f __handleUncaughtException + 615
4 libobjc.A.dylib 0x39306a65 _objc_terminate() + 129
5 libc++abi.dylib 0x38d5307b safe_handler_caller(void (*)()) + 79
6 libc++abi.dylib 0x38d53114 std::terminate() + 20
7 libc++abi.dylib 0x38d54513 __cxa_throw + 123
8 libobjc.A.dylib 0x393069bf objc_exception_throw + 95
9 CoreFoundation 0x3145b15d +[NSException raise:format:] + 1
10 Foundation 0x31d30b13 -[NSAssertionHandler handleFailureInFunction:file:lineNumber:description:] + 87
11 PhotoLibraryServices 0x366d0afb __addContextToList_block_invoke_0 + 179
12 libdispatch.dylib 0x3971e11f _dispatch_call_block_and_release + 11
13 libdispatch.dylib 0x39721ecf _dispatch_queue_drain$VARIANT$mp + 143
14 libdispatch.dylib 0x39721dc1 _dispatch_queue_invoke$VARIANT$mp + 41
15 libdispatch.dylib 0x3972291d _dispatch_root_queue_drain + 185
16 libdispatch.dylib 0x39722ac1_dispatch_worker_thread2 + 85
17 libsystem_c.dylib 0x39752a11 _pthread_wqthread + 361

クラッシュは、iOS 6.1.3 を実行している iPad からのものでした。このアプリは、iOS 7 GM の Base SDK でビルドされています。アプリはARCを使用しています。

グループを取得するために、コードで別のことをする必要がありますか?

4

2 に答える 2

3
  • 間違いなく iOS の問題であり、enumerateGroupsWithTypes:... メソッドにALAssetsGroupLibrary型の列挙が含まれている場合に再現されます。
  • どちらかを使用する必要がありますALAssetsGroupALL(含まれていませんALAssetsGroupLibrary)
  • または、OR を使用して型を列挙できますが、列挙には含めませんALAssetsGroupLibrary
  • ALAssetGroupLibrary型の列挙が本当に必要な場合はどうすればよいかわかりません。

  • 私のコードはあなたのものと非常に似ています。この問題を再現したい場合は、determineGroups メソッドを何度も呼び出してみてください (正確に 11 回実行すると問題が再現されます)。ただし、このメソッドを呼び出すたびにライブラリ オブジェクトを再作成する必要があります (fedetermineGroupsメソッドの最後でライブラリを削除できます。

  • または、新しいレシーバーに対して毎回defineGroupsメソッドを呼び出すこともできます。) また、この問題を再現するには、単一の実行ループ内で決定グループ メソッドを呼び出さないでください。
  • ボタンを作成してこのボタンをタップすると、新しいレシーバーが作成され、determineGroups が呼び出されます。このボタンを何度もタップしてみてください。

私の答えがお役に立てば幸いです。

于 2014-05-29T11:00:09.127 に答える