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