私は現在、コアデータに関する奇妙な問題に悩まされています。私が書いているアプリは、サーバーから大量のデータをダウンロードし、それがコアデータオブジェクトに変換されて保存されます。デバイスは、新しいオブジェクトを作成してサーバーにアップロードすることもできます。これらのオブジェクトの1つは、本質的にファイルの表現であるドキュメントです。
このためのモデルはですMPDocument
。MPPlace
ドキュメントは、モデルおよびモデルにリンクすることもできますMPUser
(ユーザーがドキュメントを作成し、ドキュメントは場所に属します)。
サーバーからオブジェクトをダウンロードするのに問題はなく、すべての関係が正しく作成され、割り当てられています。問題は、デバイス自体に新しいドキュメントを作成しようとしたときに発生します。ドキュメントが作成され、すべての関係を設定すると、ドキュメントがアップロードされ、すべてが正常に表示されます。しかし、Core-Data Viewerツールを使用してデータベースをチェックすると、すべてのドキュメントオブジェクトに場所の関係の値がありません。これは、新しいドキュメントだけでなく、既存のすべてのドキュメントに発生します。私は本当に何が起こっているのか理解できません!
私はそのようにドキュメントを作成しています:
MPUser *current = [MPUser currentUser];
MPDocument *doc = [[MPDocument alloc] init];
doc.name = @"App Upload";
doc.local_url = [NSString stringWithFormat:@"%@", [info valueForKey:UIImagePickerControllerReferenceURL]];
doc.local_url_type = @(MPDocumentUrlTypeAsset);
doc.user = current;
[current addCreatedDocumentsObject:doc];
[doc setValue:self.place forKey:@"place"];
[self.place addDocumentsObject:doc];
次に、すべてのアップロードを処理するドキュメントアップローダーがあります。
MPDocumentUploader *uploader = [[MPDocumentUploader alloc] initWithDocument:doc];
uploader.requestDelegate = self;
uploader.successBlock = ^(MPDocumentUploader *uploader, MPDocument *doc) {
NSLog(@"Got doc = %@", doc);
};
[uploader upload];
成功ブロックが呼び出されると、ドキュメントオブジェクトには場所の関係が設定されます。アップロードが終わっても場所が決まっているので、どこで関係が完全に解消されているのか、今は本当に戸惑っています。
ドキュメントアップローダーは次のようになります。
- (void) upload
{
.... retrieve the local file and turn into NSData. This is fine
MPRequest *request = [MPRequest requestWithURL:_url];
[MPUser signRequest:request];
[request setDelegate:_requestDelegate];
[request setRequestMethod:@"POST"];
[request mountDocumentUploader:self];
[request submit:^(MPResponse *resp, NSError *error) {
if (!error) {
NSDictionary *data = (NSDictionary *)[resp paramForKey:@"data"];
if (data) {
NSLog(@"Document = %@", _document);
_document.url = [data objectForKey:@"url"];
_document.objID = [data objectForKey:@"id"];
[_document saveLocally];
}
if (_successBlock) {
_successBlock(self, _document);
}
} else {
if (_failBlock) {
_failBlock(self, error);
}
}
}];
}
このMPRequest
クラスは、実際のすべてのアップロード要求とサーバー要求を処理しますが、実際にはMPDocumentオブジェクトには触れません。
何が起こっているのか、なぜそれが関係をクリアしているのか理解できません。誰か助けてもらえますか!?
アップデート
いろいろ試してみましたが、送信ブロックが呼び出されたときにエラーが発生することがわかりました。コメントアウト
_document.url = [data objectForKey:@"url"];
_document.objID = [data objectForKey:@"id"];
[_document saveLocally];
意図したとおりに機能しますが、これらの値は明らかに設定されていません。これらの行のいずれかを一度に1つずつ追加して戻すと、問題が発生するため、編集するだけで問題が発生するようです。それでも理由はわかりません:(