#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, которые содержатся в объекте.