2

サーバーと通信し、コアデータに保存するアプリを開発しています。

appDelegateで、シングルトンオブジェクトを起動し、useDocumentを呼び出してUIManagedDocumentを初期化しました。

- (void)useDocument
{
    if (![[NSFileManager defaultManager] fileExistsAtPath:self.database.fileURL.path]){ 

        [self.database saveToURL:self.database.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:nil];

    } else if (self.database.documentState == UIDocumentStateClosed){

        [self.database openWithCompletionHandler:nil];
    }
}

サーバーからデータを受信したときのコードは次のとおりです。

- (void)downloadCompletedWithData: (NSData *)data item: (TPDownloadItem *)finishedItem;
{
    // parse data and update core
    NSError *error;
    id dataObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
    if (dataObject && !error){

        dispatch_async(dispatch_get_main_queue(), ^{

            [User createUserWithInfo:dataObject inManagedContext:self.database.managedObjectContext];
        });
    }
}

コアデータに書き込むコードは次のとおりです。

+ (id)createUserWithInfo: (NSDictionary *)userInfo inManagedContext: (NSManagedObjectContext *)aContext
{
    NSError *error;
    User *aUser = [NSEntityDescription insertNewObjectForEntityForName:ENTITY_NAME inManagedObjectContext:aContext];

    NSString *userID = [userInfo objectForKey:USER_ID];

    aUser.userID = userID;
    aUser.effective = [NSNumber numberWithBool:[[userInfo objectForKey:USER_EFFECTIVE] boolValue]];
    aUser.job = [userInfo objectForKey:USER_JOB];
    aUser.gender = [userInfo objectForKey:USER_GENDER];

    return aUser;
}

問題は、コアデータが自動保存を試みると(約30秒間待機)、アプリがクラッシュして次のエラーが発生することです。

GCDを使用してメインスレッドで「useDocument」と「createUser」を呼び出し、UIDocument「contentsForType」をオーバーライドして、自動保存の直後に発生し、保存前のドキュメントの状態が正常であり、永続ストアファイルも作成されるようにしました。

  • 誰かが同じような状況に遭遇しますか?どんな助けでも大歓迎です!!
4

2 に答える 2

0

問題はある程度修正されました。機能させるには、電話の電源を切ってリセットする必要がありました...

しかし、なぜこれが起こる可能性があるのか​​まだわかりません

于 2013-01-29T07:59:21.300 に答える
0

マネージ コンテキストはスレッド セーフではありませんが、必要な数のマネージ コンテキストを持つことができます。おそらくディスパッチ非同期を削除します。メインスレッドでコードを実行しているため、必要ありません。

データ マネージャー クラスでバックグラウンド マネージド コンテキストを作成し、そこですべての書き込みを行い、必要に応じて通知名 MANAGEDCONTEXTDIDSAVE をリッスンし、必要に応じてリロードします。

魅力のように機能します。

于 2013-01-29T13:04:28.867 に答える