簡體   English   中英

CoreData並發

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM