0

数十人の iOS 6 ユーザーは、addPersistentStoreWithType がアプリをハングアップさせているように見えるが、他の何十万ものアクティブ ユーザーに影響を与えていないように見えるという問題を経験しています。開発フォーラムをグーグルで検索しても、まだ役に立ちません。私はこれを呼び出していますが、アプリは一部のユーザーに対してハングしています。

options = @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption: @YES, NSPersistentStoreFileProtectionKey: NSFileProtectionCompleteUnlessOpen};
[self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&addPersistentStoreError];

ドキュメントには、これが例外をスローする可能性があること、または何らかの理由でデッドロック/ハングする理由を示すものは何もありません。これは、これらのユーザーが起動するたびに繰り返し発生し、ユーザーがアプリを起動できなくなりました (再インストールを除く)。私たちが取得したすべてのクラッシュログには、例外コード 0x000000008badf00d (メインスレッドで時間がかかりすぎる原因となるもの) が含まれていました。

addPersistenStoreWithType がこのようにハングする原因は何ですか?

4

2 に答える 2

1

私も同じ問題に直面しています。ユーザーは非常に膨大なデータを持っています。addPersistentStoreWithTypeアプリがメソッドでフリーズしています。具体的には、iPad2 でこの問題に直面しています。iPad3 の場合と同様に、データ移行は完全に機能しています。永続ストアを優先度の高いスレッドに追加し、移行中にユーザーに何かを表示します。

(void)performLightweightMigrationInBackgroundWithStoreURL:(NSURL *)storeURL
 {
    [self.initializerDelegate willStartMigration];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){
        NSDictionary *storeOptions = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

        NSError *error = nil;
        if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:storeOptions error:&error]) {
            dispatch_async(dispatch_get_main_queue(), ^(void){
               // we showed an alert message for migration failure
            });
        } else {
            dispatch_async(dispatch_get_main_queue(), ^(void){
                // we showed an alert message for successful migration
            });
        }
    });
}
于 2013-12-04T04:28:20.837 に答える
0

-applicationDidFinishLaunching:移行する潜在的に大きな DB を扱っている場合は、iOS の前にその方法でアプリをセットアップするのに数秒しかないため、永続ストアの初期化 (および移行の実行) を避けることをお勧めします。それを殺します。そこには多くのヘッドルームがありません。

代わりに、アプリを起動し、最初のビュー コントローラーにコンテンツを読み込んでいることを示すスピナーまたはその他の兆候を表示し、0 などの遅延で-applicationDidFinishLaunching:戻った後にストアを読み込みます。-performSelector:withObject:afterDelay:

于 2013-08-13T19:12:01.680 に答える