[英]CoreData concurrency
我在CoreData持久性方面存在問題(MagicalRecord 2.2,iOS 7.x)可以在任何線程上創建和使用主對象:
- (Collection *)collection {
if (!_collection) {
[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
_collection = [Collection MR_createInContext:localContext];
_collection.creationDate = [NSDate date];
_collection.collectionDescription = @"";
_collection.name = [CollectionHelper getNameForUnnamedCollection];
}];
}
return _collection;
}
在任何代碼位置,我都可以在后台線程中開始向此集合添加資源:
if (self.photoSavingBlocksCount == 0) {
[self beginPhotoSaving];
}
self.photoSavingBlocksCount++;
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
Collection *localCollection = [self.collection MR_inContext:localContext];
[localCollection addNewResourceForImage:image thumb:thumb gallery:gallery type:RESOURCE_TYPE_IMAGE];
} completion:^(BOOL success, NSError *error) {
self.photoSavingBlocksCount--;
if (self.photoSavingBlocksCount == 0) {
[self endPhotoSaving];
}
}];
此代碼將集合及其資源標記為已上傳到服務器:
- (BOOL)markCollectionAsUploaded:(Collection *)collection {
[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
Collection *localCollection = [collection MR_inContext:localContext];
localCollection.uploaded = @YES;
localCollection.uploadDate = [NSDate date];
}];
return YES;
}
該代碼可以正常工作,但是如果我在此之前編輯收藏集,則此代碼將失敗並且收藏集將不會保存為上載! 換句話說,在下一次獲取時,我將獲得collection.uploaded == @NO!
此代碼保存已編輯的集合
[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
Collection *localCollection = [self.collection MR_inContext:localContext];
NSSet *set = [NSSet setWithArray:self.deletedResources];
localCollection.uploaded = @NO;
localCollection.name = ([fieldName.text length] == 0 || [[fieldName.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0)
? [CollectionHelper getNameForUnnamedCollection]
: fieldName.text;
localCollection.collectionDescription = [fieldDescription.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
for (Resource *resource in set) {
Resource *localResource = [resource MR_inContext:localContext];
[CollectionHelper removeResourceFiles:resource];
[localResource MR_deleteEntity];
}
}];
在日志中,每次保存上下文時,我都會看到相同的圖片:
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x196e2ee0) → Saving <NSManagedObjectContext (0x196e2ee0): *** UNNAMED ***> on *** BACKGROUND THREAD ***
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x196e2ee0) → Save Parents? 1
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x196e2ee0) → Save Synchronously? 1
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x17d83e30) → Saving <NSManagedObjectContext (0x17d83e30): *** BACKGROUND SAVING (ROOT) ***> on *** BACKGROUND THREAD ***
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x17d83e30) → Save Parents? 1
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x17d83e30) → Save Synchronously? 1
有人可以告訴我一種針對我的情況管理CoreData對象的正確方法嗎? 我將不勝感激。
在您的第一段代碼中,您想執行以下操作:
- (Collection *)collection {
if (!_collection) {
[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
_collection = [Collection MR_createInContext:localContext];
_collection.creationDate = [NSDate date];
_collection.collectionDescription = @"";
_collection.name = [CollectionHelper getNameForUnnamedCollection];
}];
}
_collection = [_collection MR_inContext:self.context];
return _collection;
}
當您從保存塊返回時,localContext將從內存中丟棄,並且您的對象將無法保存。 為避免此問題,您應該然后將此新對象刷新到本地的壽命較長的上下文中。 您可以通過不使用塊來完全避免這種模式,並將其直接保存到您的更長時間的上下文中。
而且,老實說,我沒有讀完其余的問題,因為應該首先解決此問題,以避免模糊的崩潰崩潰……
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.