2014-01-07 2 views
1

Учитывая следующий интерфейс:CoreData и MagicalRecord. Как я должен правильно обрабатывать данные только тогда, когда пользователь нажимает?

@interface Country : NSManagedObject 

@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSNumber * isAggressive; 

@end 

У меня есть окно, в котором пользователь может увидеть список Countries и переключать isAgressive флаг. Параметры сохраняются только тогда, когда пользователь нажимает. У них также есть возможность удалять отмену.

Исходя из этого, я использую следующий код, чтобы загрузить все страны, когда экран нагрузки:

tempContext = [NSManagedObjectContext MR_context]; 
// Load our countries. 
countries = [Country MR_findAllSortedBy: @"name" 
           ascending: YES 
           inContext: tempContext]; 

Я делаю это в tempContext, а не контекст по умолчанию, так как я не хочу, чтобы эти объекты вмешиваться в что-либо другое.

Отмена, я не делаю ничего конкретного. Просто позвольте tempContext покинуть область действия. Применяйте, я пытаюсь выполнить следующие действия:

// Save changes. 
[MagicalRecord saveWithBlock: ^(NSManagedObjectContext * saveLocalContext) 
{ 
    [countries enumerateObjectsUsingBlock: ^(Country * country, NSUInteger countryIndex, BOOL * stop) 
     { 
      [country MR_inContext: saveLocalContext]; 
     }]; 
} completion:^(BOOL success, NSError *error) { 
    NSLog(@"Completed: %@, %@.", success ? @"true" : @"false", error.localizedDescription); 
    //This is called when data is in the store, and is called on the main thread 
}]; 

Это, однако, похоже, не вносит никаких изменений. При работе в отладке, я получаю следующие сообщения журнала:

[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x6000001dc020) NO CHANGES IN ** UNNAMED ** CONTEXT - NOT SAVING 

Completed: false, (null).

И мои обновления не сохраняются. Как правильно обрабатывать обновленные объекты и выполнять сохранение?

+0

Покажите, как вы создаете контекст «темп». – Wain

+0

Создание 'tempContext' находится в образце кода:' tempContext = [NSManagedObjectContext MR_context]; ' – Kyle

ответ

2

Проблема в том, что [MagicalRecord saveWithBlock... сохраняет значение по умолчаниюContext, а не ваш tempContext.

Попробуйте вызвать что-то вроде [tempContext MR_saveToPersistentStoreWithCompletion ... вместо

1

При вызове [MagicalRecord saveWithBlock:], этот метод создает новый контекст для вас для выполнения вашей операции сохранения в пределах блока. Ваш случай использования немного отличается. У вас уже есть контекст царапанию для работы, так что вы хотите использовать следующую схему:

NSManagedObjectContext *scratchContext = ...; 

country = [Country MR_createInContext:scratchContext]; 
country.name = @"Belgium"; 
//...what ever other data is entered here. 

//Somewhere in your apply method 
[self.scratchContext MR_saveToPersistentStoreAndWait]; 

Есть несколько вариаций на методе сохранения, посмотрите на заголовок и исходный код для более подробной информации. Но в основном у вас есть 2 варианта. Первый - это сохранение и блокировка, или дождаться завершения. Второй - сохранение в фоновом режиме. Вы можете пройти в блоке завершения, чтобы узнать, когда операция сохранения завершена, и если она была успешной или нет.

Смежные вопросы