Я работаю над старым невероятно плохо написанным приложением Objective-C.Функция, над которой я работаю, включает в себя получение разных типов записей из основных данных и отправку их на сервер.И один тип записи (A) должен быть отправлен перед отправкой другого (B).
РЕДАКТИРОВАТЬ: A
относится к ActivitySession
объектам и B
относится к ActivityRun
объектам.
Вот проблема: где-то в приложении есть какой-то слушатель, удаляющий все записи B после отправки записей A.Я провел некоторое время, пытаясь выяснить, где это происходит, но мне не повезло.Моим решением было просто загрузить все записи B в память перед отправкой записей A (думая, что даже если записи B будут удалены из основных данных, они все равно будут существовать в памяти).Но я обнаружил, что после того, как B-записи удалены из основных данных, мой массив записей также очищается.
Вот сущность логики, о которой я говорю:
__block NSArray* activityRuns = [coreData fetchByEntitiyName:@"ActivityRun"];
NSLog(@"---> Sending %@ students", @([students count]));
return [self sendStudents:students withApiKey:apiKey]
.then(^{
// This must happen before sending anything with activity references
NSLog(@"---> Fetching activities");
return [self fetchActivitiesWithApiKey:apiKey];
})
.then(^{
NSArray* data = [coreData fetchByEntitiyName:@"ActivitySession"];
NSLog(@"---> Sending %@ activity sessions", @([data count]));
return [self sendActivitySessions:data withApiKey:apiKey].catch(failLogger(@"Failed to upload activity sessions", nil));
})
.then(^{
NSLog(@"---> Sending %@ activity runs", @([activityRuns count]));
return [self sendActivityRuns:activityRuns withApiKey:apiKey].catch(failLogger(@"Failed to upload activity runs", nil));
})
activityRuns
- это данные в памяти, которые я пытаюсь отправить (с [self sendActivityRuns:activityRuns withApiKey:apiKey]
).Вот как определяется fetchByEntitiyName
:
- (NSArray*) fetchByEntitiyName:(NSString*) entityName {
NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] initWithEntityName:entityName];
NSError* error = nil;
NSArray* results = [_mainQueueContext executeFetchRequest:fetchRequest error:&error];
if (results == nil) {
ELog(@"--- Failed to fetch %@: %@", entityName, error);
return @[];
}
return results;
}
activityRuns
не используется / не передается нигде, кроме приведенного выше фрагмента кода, где каждый запуск операции отправляется с использованием HTTP-запроса.Я попытался добавить точки останова сразу после создания массива (объекты действительны и содержат данные) и непосредственно перед отправкой (все они nil
).
Как сохранить основные данные отгадить на мои объекты в памяти, когда что-то удаляет записи?