从Parse缓存PFFile数据

3
我的应用程序是一种类似于消息的应用程序,在其中您可以“标记”另一个用户(有点像Twitter)。
现在,当显示此消息时,已标记用户所拥有的头像将与该消息一起显示。
用户的头像作为PFFile存储在PFUser对象上。
我会像这样加载它...
PFImageView *parseImageView = ...

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

这一切都很好。

代码中如果需要加载,大部分时间不会触及网络,因为大多数情况下它已经缓存了用户数据。

然而,在后台加载图片并将其放入图像视图的部分每次都会运行。似乎没有对PFFile数据进行任何缓存。

即使下载了同一用户的头像多次,仍然会去网络获取。

有办法让这些数据缓存起来吗?还是我必须自己实现?


我几乎有同样的问题,我正在使用他们的缓存策略之一,但它有一些缺点。如果您检查Anypic的代码,您可以看到另一个更高级的解决方案,他们用于喜欢和评论,但对我来说太难了。 - rihekopo
@vv88 谢谢,我会看一下任何图片源代码。 - Fogmeister
3个回答

6

如果之前的PFQuery使用了缓存策略,如下所示,PFFile会自动为您缓存文件:

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

希望这有所帮助 :)

0
最终我创建了一个带有NSCache的单例,并在访问Parse之前查询它。
目前作为一个快速的解决方案。当然,这意味着每个新会话都必须重新下载所有图像,但现在比以前好多了。

-1
您可以像下面的代码一样缓存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");
}

Source:https://parse.com/questions/hascachedresult-always-returns-no

希望它能对你有所帮助....!

谢谢,但问题不在对象上。问题在于对象中包含的PFFile数据。 - Fogmeister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接