簡體   English   中英

RestKit和托管對象上下文

[英]RestKit and Managed Object Contexts

我正在嘗試最好地格式化我的項目對RestKit和Core Data的使用。 我正在做一些事情,但是我覺得它們的實現不佳,可能導致線程不安全...我有一個對象可以管理我所有的數據傳輸,存儲等,它具有一個功能設置restkit。 我有一個用於RKObjectManager的實例變量,在此設置功能中,我創建了objectStore,設置了所有屬性映射,創建了持久存儲,等等,-所有正常的restkit設置代碼。 在此功能之外,此對象唯一可用的是_objectManager實例變量,我已將其用於NSFetchRequests等。

我要確保執行正確的兩件事,即獲取托管對象並保存對托管對象的更改。

如果要更新對象的屬性,請執行以下操作:

object.whatever = @"something here";

NSError *error;
if (![object.managedObjectContext save:&error]) {
    // log the error here
}

這是更新/保存對象屬性的正確方法嗎? 是直接在代碼的任何位置保存訪問對象的托管對象上下文的權限,還是僅應在后台/前景中執行此操作? 我當前的實現可能在后台和前台都調用了此方法,我只想確保它可以接受。

當我想獲取一個對象時,我編寫了一個函數,該函數將實體名稱,謂詞數組和排序描述符作為參數,以便可以重用:

    NSManagedObjectContext *managedObjectContext = // I DONT KNOW WHAT TO PUT HERE! //

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    NSPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicates];
    [fetchRequest setPredicate:compoundPredicate];

    NSError *error;
    NSArray *fetchedRecords = [managedObjectContext executeFetchRequest:fetchRequest error:&error];

    if (error) {
        // log error
    }

    // if we were given a sort descriptor, sort the array appropriately
    if (sortDescriptor) {
        fetchedRecords = [fetchedRecords sortedArrayUsingDescriptors:@[sortDescriptor]];
    }

    return fetchedRecords;

我的問題是創建/訪問正確的托管對象上下文。 我應該怎么做? 我是否可以訪問之前創建的RKObjectManager上的某些屬性,例如:

_objectManager.managedObjectStore.mainQueueManagedObjectContext

還是那不是線程安全的,因為它用於主線程? 我該怎么做才能確保使用正確的托管對象上下文,並且它是線程安全的? 我正在使用:

_objectManager.managedObjectStore.persistentStoreManagedObjectContext

但是有人告訴我,這絕對不是最佳實踐,也不是線程安全的,所以我正在嘗試確定最佳解決方案。

編輯-也許我想獲取對象時都可以調用此函數來獲取上下文?

- (NSManagedObjectContext *)getManagedObjectContext {
    if ([NSThread isMainThread]) {
        return _objectManager.managedObjectStore.mainQueueManagedObjectContext;
    }
    else {
        return [_objectManager.managedObjectStore newChildManagedObjectContextWithConcurrencyType:NSPrivateQueueConcurrencyType tracksChanges:YES];
    }
}

為了保存,請執行以下操作:

if (![object.managedObjectContext save:&error]) {

你應該做:

if (![object.managedObjectContext saveToPersistentStore:&error]) {

這樣更改就可以一直保存到磁盤存儲上。 您應該只在創建/獲取托管對象的線程上執行此操作(因此,將保持MOC的線程所有權)。

前景/背景並不重要,因為每個線程使用哪個MOC。 如果尊重MOC線程所有權,那么您應該沒事。

同樣適用於獲取。 對於UI更新,必須使用主線程和mainQueueManagedObjectContext 您永遠不要直接使用persistentStoreManagedObjectContext 對於任意后台線程,您應該要求托管對象存儲庫為您創建一個新的子托管對象上下文並使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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