2015-05-22 1 views
1

Я устанавливаю политику кэша моего объекта PFQuery в kPFCachePolicyCacheThenNetwork, но кеш остается пустым все время. Может кто-нибудь помочь мне в том, что происходит?Кэш PFQuery равно нулю все время

Ниже код возвращает кэшированные результаты пустой все время,

-(void)doSomeQuery 
{ 
    PFQuery *query = [PFQuery queryWithClassName:kMySpecialClass]; 
    [query whereKey:kDateExpires greaterThan:[NSDate date]]; 
    query.cachePolicy = kPFCachePolicyCacheThenNetwork; 
    NSLog(@"CACHED ? = %i",[query hasCachedResult]);//Nope, no matter what returns NO 
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 


    NSLog(@"RETURNED: %@", objects);//1st cache (null) then network gets the data 

    }]; 

} 

ответ

1

Для получения кэшированного результата запрос должен соответствовать (или быть равным) более раннему запросу, где результат был кэширован. Запрос, размещенный в вопросе, различен каждый раз, потому что он квалифицируется [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); 
    }]; 
} 

Что приятно о кэш-затем сетевая особенность заключается в том, что в связанных ситуациях ваш запрос на обслуживание по-прежнему остается относительно современным с сервером, поскольку после запроса, молча и, если возможно, создается реальный запрос и появляются новые экземпляры. Конечно, некоторые из них будут истекли, потому что время идет вперед, но мы позаботимся об этом с последующим фильтром в памяти.

+0

Спасибо @danh Любые работы вокруг на этом? За исключением локального хранилища данных – fzkl

+0

@fzkl - Конечно. Не так просто ответить, но я сделал это лучше всего. – danh

+0

спасибо большое @danh – fzkl

0

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

  • Можете ли вы также подтвердить, что запрос возвращается в порядке, не устанавливая cachePolicy?

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

+0

Спасибо за ответ, но он возвращает сначала из кеша, а затем сеть, как указано в их документах. Запрос всегда возвращается, но кеш будет пустым.CacheThenNetwork: запрос сначала загружается из кеша, а затем загружается из сети. В этом случае обратный вызов будет фактически вызываться дважды - сначала с кешированными результатами, а затем с результатами сети. – fzkl

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

  • Нет связанных вопросов^_^