2014-01-16 201 views
0

我目前正在開發一個使用核心數據來存儲數據的應用程序。應用程序通過下載和解析一個巨大的XML文件(大約40000個條目)將其內容與Web服務器同步。該應用程序允許用戶搜索數據並對其進行修改(CRUD)。取回操作太重,這就是爲什麼我決定使用以下模式:未保存核心數據數據

「主線程的一個託管對象上下文(NSMainQueueConcurrencyType),以刷新用戶界面。大量讀取和更新通過多個後臺管理對象上下文(NSPrivateQueueConcurrencyType)。不使用兒童上下文「。我試圖更新或刪除一個「用戶」(對象「用戶」是從填充數組中獲得)在後臺上下文中的一些對象(讓我們說數組「最後我保存了上下文。

我正在聽NSManagedObjectContextDidSaveNotification並將任何修改與我的主線程管理對象上下文合併。

除了當我重新啓動我的應用程序,我意識到沒有任何修改已保存,每件事情都可以正常工作。

下面是一些代碼解釋所使用的圖案

  1. 主管理對象上下文:

    -(NSManagedObjectContext *)mainManagedObjectContext { 
    
    if (_mainManagedObjectContext != nil) 
    { 
        return _mainManagedObjectContext; 
    } 
    
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    
    _mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
    [_mainManagedObjectContext setPersistentStoreCoordinator:coordinator]; 
    
    return _mainManagedObjectContext; 
    

    }

  2. 背景管理對象上下文:

    -(NSManagedObjectContext *)newManagedObjectContext { 
    
    NSManagedObjectContext *newContext; 
    
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    
    newContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
    [newContext performBlockAndWait:^{ 
    
        [newContext setPersistentStoreCoordinator:coordinator]; 
    }]; 
    
    return newContext; 
    

    }

  3. 更新記錄:

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    
    FootBallCoach *coach = [_coaches objectAtIndex:indexPath.row]; 
    coach.firstName = [NSString stringWithFormat:@"Coach %i",indexPath.row]; 
    
    NSManagedObjectContext *context = [[SDCoreDataController sharedInstance] newManagedObjectContext]; 
    [context performBlock:^{ 
    
        NSError *error; 
        [context save:&error]; 
    
    
        if (error) 
        { 
         NSLog(@"ERROR SAVING : %@",error.localizedDescription); 
        } 
    
        dispatch_async(dispatch_get_main_queue(), ^{ 
         [self refreshCoaches:nil]; 
        }); 
    }]; 
    

    }

我失去了什麼東西?我應該在保存後臺上下文後保存主要的託管對象上下文嗎?

回答

1

如果您的上下文使用持久性存儲協調器進行配置,則保存應將數據寫入存儲。如果您的上下文使用另一個上下文作爲父級配置,則保存會將數據推送給父級。只有當最後一個父配置文件被配置爲持久性存儲協調器時,纔會寫入商店。

  1. 檢查您的後臺上下文是否配置了持久存儲協調器。
  2. 檢查返回值和-save:的可能錯誤。
  3. 確保您通過-performBlock...:方法處理您的背景環境。

UPDATE

每次你打電話給你-newManagedObjectContext方法時,都會創建一個新的上下文。這個上下文對你正在更新的FootBallCoach對象一無所知。您需要保存FootBallCoach對象所屬的上下文。

不要忘了,每個對象都屬於一個且只有一個方面。

另外,還要確保你持有的強引用其對象你使用的上下文。

+0

我編輯我的問題,並增加了一些示例代碼。正如你所看到的,沒有父子上下文模式,保存錯誤爲零。 – rokridi

+0

您每次都在創建新的上下文。更新了答案。 – eofster

+0

FootBallCoach對象在主要上下文中獲取。那麼你是說我應該保存主要的上下文嗎? – rokridi