Кэширование данных PFFile из синтаксического анализа

#ios #objective-c #parse-platform #pffile

#iOS #objective-c #parse-платформа #pffile

Вопрос:

Мое приложение — это приложение в стиле обмена сообщениями, и в нем вы можете «пометить» другого пользователя. (Немного похоже на twitter).

Теперь, когда отображается это сообщение, вместе с этим сообщением отображается аватар, принадлежащий человеку (ам), который был отмечен.

Аватар пользователя сохраняется в виде PFFile для объекта PFUser.

Я загружаю его примерно так…

 PFImageView *parseImageView = ...

[taggedUser fetchIfNeededInBackgroundWithBlock:^(PFObject *user, NSError *error) {
    parseImageView.file = user[@"avatar"];
    [parseImageView loadInBackground];
}];
  

Все это работает нормально.

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

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

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

Есть ли способ отправить эти данные в кэш или это то, что мне придется реализовать самому?

Комментарии:

1. У меня почти такая же проблема, я использую одну из их политик кэширования, но у нее есть некоторые недостатки. Если вы проверите код Anypic, вы можете увидеть другое, более продвинутое решение, которое они использовали для лайков и комментариев, но для меня это было сложно.

2. @vv88 спасибо, я посмотрю исходный код any pic.

Ответ №1:

PFFile автоматически кэширует файл для вас, если предыдущий PFQuery использует политику кэширования, такую как:

 PFQuery *query = [PFQuery queryWithClassName:@"MyClass"];
query.cachePolicy = kPFCachePolicyCacheThenNetwork;
  

Чтобы проверить, находится ли PFFile в локальном кэше, используйте:

 @property (assign, readonly) BOOL isDataAvailable
  

Например:

 PFFile *file = [self.array objectForKey:@"File"];
if ([file isDataAvailable])
{
    // no need to do query, it's already there
    // you can use the cached file
} else
{
    [file getDataInBackgroundWithBlock:^(NSData *data, NSError *error)
    {
        if (!error)
        {
            // use the newly retrieved data
        }
    }];
}
  

Надеюсь, это поможет 🙂

Ответ №2:

В конце я создал синглтон с NSCache помощью и запросил это, прежде чем перейти к анализу.

Пока работает как быстрая остановка. Конечно, это означает, что каждый новый сеанс должен загружать все изображения заново, но сейчас это намного лучше, чем было.

Ответ №3:

Вы можете кэшировать результат PFQuery, как показано ниже, и вам нужно проверять наличие кэша, не находя объекты в фоновом режиме каждый раз..при извлечении изображения.У него также есть некоторые другие политики кэширования..Пожалуйста, проверьте также прикрепленную ссылку..

 PFQuery *attributesQuery = [PFQuery queryWithClassName:@"YourClassName"];
attributesQuery.cachePolicy = kPFCachePolicyCacheElseNetwork;  //load cache if not then load network
if ([attributesQuery hasCachedResult]){
    NSLog(@"hasCached result");
}else{
    NSLog(@"noCached result");
}
  

Источник: https://parse.com/questions/hascachedresult-всегда-возвращает-нет

Надеюсь, это поможет вам ….!

Комментарии:

1. Спасибо, но проблема не в объекте. Проблема заключается в данных PFFile, которые содержатся в объекте.