MagicalRecord saveWithBlock завершение использования

Я использую [MagicalRecord saveWithBlock: completion:] метод, но я не уверен, как получить доступ к сохраненному объекту в блоке завершения. Мой код следующий

NSLog(@"saving player");
__block PSPlayer *player;
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
    // parse json
    player = [self parsePlayer:playerInfoJson inContext:localContext];
    NSLog(@"player.md5Id %@", player.md5Id);

} completion:^(BOOL success, NSError *error) {
    NSLog(@"player.md5Id in success %@ error %@", player.md5Id, error);
    ...
}];

player.md5Id правильно установлен в конце блока сохранения, но равен нулю в завершении. Это правильное использование?

ура, Ян

1 ответ

Решение

Блок завершения захватывает player ссылка до того, как она установлена, поэтому она будет равна нулю, когда этот блок будет выполнен.

Если вы хотите использовать новый управляемый объект позже, вы должны сохранить его в свойстве, а затем вызвать метод из блока завершения (возможно, переключаясь на основной поток, не уверен, что MR сделает это за вас), чтобы найти этот объект в основной контекст.

В качестве альтернативы я думаю, что вы могли бы определить блок завершения раньше, а затем передать copy к методу, то копия будет иметь доступ к обновленной player ссылка (на самом деле я делаю это не очень часто, но IIRC должен работать).

Другие вопросы по тегам