Кэширование данных PFFile из Parse

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

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

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

Я загружаю его как-то так...

PFImageView *parseImageView = ...

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

Это все работает нормально.

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

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

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

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


person Fogmeister    schedule 17.06.2014    source источник
comment
У меня почти такая же проблема, я использую одну из их политик кеша, но у нее есть некоторые недостатки. Если вы посмотрите код Anypic, вы увидите еще одно более продвинутое решение, которое они использовали для лайков и комментариев, но для меня это было слишком сложно.   -  person rihe    schedule 17.06.2014
comment
@ vv88 спасибо, я посмотрю исходный код любого изображения.   -  person Fogmeister    schedule 17.06.2014


Ответы (3)


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
        }
    }];
}

Надеюсь, поможет :)

person Victor Chandra    schedule 12.04.2015

В конце концов я создал синглтон с NSCache и запросил его, прежде чем перейти к Parse.

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

person Fogmeister    schedule 18.06.2014

Вы можете кэшировать результат 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-always-returns-no

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

person Vidhyanand    schedule 17.06.2014
comment
Спасибо, но проблема не в объекте. Проблема заключается в данных PFFile, содержащихся в объекте. - person Fogmeister; 17.06.2014