Установите для Core Data отношение отложенной загрузки к одному

Я использую AFIncrementalStore для подключения моего приложения iOS к моему REST API. Когда я загружаю свой начальный контроллер представления, я создаю NSFetchRequest, который загружает последние 100 Events (NSManagedObjects) в поле зрения. Проблема в том, что каждый Event имеет отношения 1:1 с Group объект, и как только Event загружается, инкрементное хранилище предлагается заполнить Group объект, который в моем случае вызывает индивидуальный запрос к серверу для каждого из 100 Events,

Я вижу несколько способов решить эту проблему, например, не запрашивая Groups с сервера, если они уже сохранены локально, кэшируют сетевой запрос или не сохраняют отношения в NSManagedObject. Но в идеале Group Объект может начинаться как Fault и запрашивать заполнение только после обращения к одному из его полей, аналогично тому, что происходит с отношениями "один ко многим". К сожалению, я не могу найти какую-либо документацию, в которой говорится, как принудительно загружать отношения "один к одному" в базовых данных. Является ли это возможным?

2 ответа

Может быть, это то, что вы ищете?

Из AFIncrementalStore.h:

/**
Returns whether the client should fetch remote relationship values for a
particular managed object. This method is consulted when a managed object
faults on a particular relationship, and will call
`-requestWithMethod:pathForRelationship:forObjectWithID:withContext:` if `YES`.
@param relationship The relationship of the specifified managed object
@param objectID The object ID for the specified managed object.
@param context The managed object context for the managed object.
@return `YES` if an HTTP request should be made, otherwise `NO.  */

- (BOOL)shouldFetchRemoteValuesForRelationship:(NSRelationshipDescription*)
        relationship forObjectWithID:(NSManagedObjectID *)objectID
        inManagedObjectContext:(NSManagedObjectContext *)context;

Если это так, вы можете установить это с

- (BOOL)shouldFetchRemoteValuesForRelationship:(NSRelationshipDescription *)relationship forObjectWithID:(NSManagedObjectID *)objectID inManagedObjectContext:(NSManagedObjectContext *)context
{
    return NO;
}

в вашем AFRESTClient <AFIncrementalStoreHTTPClient> подкласс.

Я тоже боролся с этим. Похоже, отношения один-к-одному всегда будут загружены. Одним из способов решения этой проблемы может быть объявление его как отношения "один ко многим", чтобы вместо этого он автоматически выполнял ленивую загрузку. Затем в вашем классе модели вы можете иметь метод, который возвращает первый в наборе.

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