Для получения кэшированного результата запрос должен соответствовать (или быть равным) более раннему запросу, где результат был кэширован. Запрос, размещенный в вопросе, различен каждый раз, потому что он квалифицируется [NSDate date]
.
Чтобы убедиться, что запрос имеет кешированный результат, сохраните тот же объект PFQuery
. Если вы установите kPFCachePolicyCacheThenNetwork
и запустите find ... на нем второй раз, вы получите кешированный результат.
EDIT - Работая вокруг этого, это зависит от того, насколько чувствительна система к времени. Давайте рассмотрим этот запрос: дайте мне неиспользуемые экземпляры MySpecialClass, где в будущем не истечет срок действия.
Давайте использовать использование локального кеша, чтобы иногда требовать быстрого запроса и/или автономной работы, и я готов обменять правду относительно того, что находится на сервере (возможно, сервер не получает новых экземпляры MySpecialClass очень часто).
постольку, поскольку эти вещи истинны, вы можете обойти эту проблему, О.П. при наличии двух типов запросов:
1) Запрос обновления, делается реже, что сдувает кэш и получает новейшие неистекшие с сервера. Этот запрос реализован точно так же, как в OP-коде, но с использованием стратегии кеша по умолчанию: только для сети.
2) Запрос на обслуживание, выполняемый более часто, который зависит от кеша, но работает быстро и автономно. Этот запрос по-прежнему хочет исключить истекшие экземпляры моего специального класса, но мы делаем это в коде после запроса. Реализовать этот запрос является свойством, которое сохраняется (по крайней мере, во время выполнения, может быть, между казнями, но это другая тема) и использовать кэш-Then-сети следующим образом:
@property (strong) PFQuery *maintenanceQuery;
// lazily init
- (PFQuery *)maintenanceQuery {
if (!_maintenanceQuery) {
// op code, including cachePolicy = kPFCachePolicyCacheThenNetwork;
}
return _maintenanceQuery;
}
// based on some timing decision, either run the refresh query or...
- (void)runMaintenanceQuery:(void (^)(NSArray *, NSError *))completion {
[self.maintenanceQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
NSDate *now = [NSDate date];
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(PFObject *mySpecialInstance, NSDictionary *bind){
NSDate *expiration = [mySpecialInstance valueForKey:kDateExpires];
return now == [expiration earlierDate:now];
}];
NSArray *unexpired = [objects filteredArrayUsingPredicate:predicate];
completion(unexpired, error);
}];
}
Что приятно о кэш-затем сетевая особенность заключается в том, что в связанных ситуациях ваш запрос на обслуживание по-прежнему остается относительно современным с сервером, поскольку после запроса, молча и, если возможно, создается реальный запрос и появляются новые экземпляры. Конечно, некоторые из них будут истекли, потому что время идет вперед, но мы позаботимся об этом с последующим фильтром в памяти.
Спасибо @danh Любые работы вокруг на этом? За исключением локального хранилища данных – fzkl
@fzkl - Конечно. Не так просто ответить, но я сделал это лучше всего. – danh
спасибо большое @danh – fzkl