サーバーと通信し、コアデータに保存するアプリを開発しています。
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」をオーバーライドして、自動保存の直後に発生し、保存前のドキュメントの状態が正常であり、永続ストアファイルも作成されるようにしました。
- 誰かが同じような状況に遭遇しますか?どんな助けでも大歓迎です!!