2014-02-18 2 views
0

Проще всего я хочу перебирать через CoreData [self.fetchedResultsController fetchedObjects] (точнее, я использую MagicalRecord в этом примере) и изменять все элементы, соответствующие моим критериям (оператор if), а затем вносить изменения в эти объекты.Редактирование нескольких объектов в fetchedObjects CoreData

for (Task *aTask in [[self.fetchedResultsController fetchedObjects] mutableCopy]) { 
    if ([aTask.day past] && [[aTask isArchived] isEqual:@(NO)]) { 

     NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext]; 
     [context MR_saveOnlySelfWithCompletion:^(BOOL success, NSError *error) { 
      aTask.day = date; 
     }]; 
    } 
} 

Но, как оказалось, это не сработает! Я пытаюсь решить, где мне не нужно вручную управлять всем CoreData, поскольку этот answer определяет и вместо этого находит сжатое решение проблемы, несколько строк кода и не много итераций.

EDIT: После ответа от Дэна, я отредактировал мой несовершенный код для ...

NSPredicate *uncompletedTasks = [NSCompoundPredicate andPredicateWithSubpredicates:@[[NSPredicate predicateWithFormat:@"day < %@ AND isArchived = %@",[NSDate date],@NO]]]; 
self.fetchedResultsController = [Task MR_fetchAllSortedBy:@"dateScheduled" ascending:YES withPredicate:uncompletedTasks groupBy:nil delegate:self inContext:[NSManagedObjectContext MR_defaultContext]]; 

for (Task *aTask in [self.fetchedResultsController fetchedObjects]) { 
    aTask.day = date; 
} 

NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext]; 
[context MR_saveOnlySelfWithCompletion:^(BOOL success, NSError *error) {}]; 

Это решает проблему, но только на мгновение, когда я обновить представление, я получаю эту ошибку:

CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. *** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects 1 with userInfo (null)

+0

Почему вы устанавливаете делегат для этого FRC? –

+1

здесь нет необходимости в «полноценной» FRC, не можете ли вы просто выполнить выборку, чтобы получить все объекты '[context executeFetchRequest: ...]' или '[Task" объекты, отвечающие предикату ... "] '? –

+0

Но это что-то изменит? Не будет ли это тем же результатом, что и «полноценный» FRC.Меньше кода. – Souljacker

ответ

1

Я действительно ничего не знаю о MagicalRecord, но ...

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

1) выполнить обновление в фоновом режиме
2) извлечь только те объекты, которые необходимо обновить. Пример предиката:

NSPredicate* needUpdate = [NSPredicate predicateWithFormat:@"day < %@ AND isArchived = %@",[NSDate date],@NO]; 
NSPredicate* p = [NSCompoundPredicate andPredicateWithSubpredicates:@[FRC_predicate,needUpdate]]; 

3. выполнить одно сохранить после обновляются все объекты (или в пакетах, не сохранить один за другим)

Гадание ...
Вы писали код, сделать обновление объекта (aTask.day = date;) в блоке завершения.
Возможно, на самом деле это не может измениться так, как вы думаете.
сделайте обновление, прежде чем вы вызовете процедуру «сохранить».

+0

См. Мое редактирование, я внесла изменения в свой код. – Souljacker

0

Несколько проблем здесь.

Во-первых, я не уверен, зачем вам нужно mutableCopy. Вы не изменяете элементы массива yo, итерации, поэтому это не обязательно. Я даже не уверен, что эффект создания копии управляемого объекта в этом случае. Просто оставьте это.

Во-вторых, ваше булево сравнение немного запутанно и может быть написано более простым способом. Этого должно быть достаточно:

"... && aTalk.isArchived.boolValue" 

В-третьих, вы меняете объект в блоке завершения после сохранения. Таким образом, вы не сохраняете изменения, возможно, предыдущий, сделанный в предыдущей итерации через цикл. Вместо этого просто напишите изменения и вызовите save после цикла.

При сохранении убедитесь, что используемый контекст совпадает с используемым контекстом выбранного контроллера результатов.

+0

Посмотрите мои изменения, я внесла изменения в свой код. – Souljacker

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