【问题标题】:iOS/Parse.com - Creating a Cache for a PFQueryiOS/Parse.com - 为 PFQuery 创建缓存
【发布时间】:2015-08-05 17:18:52
【问题描述】:

我无法理解如何使用 Parse 缓存和检索对象。我正在尝试创建一个查询,并缓存对象,然后只检索缓存的对象,除非用户将对象保存到 PFObject,然后我想使用网络重新加载数据。

这是我的尝试,也是我查询 PFObjects 的方式。

    //Gets the playlists from the desired user
    +(void)getPlaylistsForUser:(PFUser *)user withCompletion:(void(^)(NSMutableArray *playlists))completion
    {
        PFQuery *userQuery = [PFQuery queryWithClassName:@"Playlists"];
        userQuery.cachePolicy = kPFCachePolicyCacheElseNetwork;
        [userQuery whereKey:@"userId" equalTo:[user objectId]];
        [userQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
            if (!error){
                NSMutableArray *playlists = [[NSMutableArray alloc]init];
                playlists = [objects mutableCopy];
                    completion(playlists);
                }
        }];
    }

How would I go about notifying the query that there needs to be a network call instead of returning cached results?

编辑:我只用几行代码就设法获得了所需的功能。

//Gets the playlists from the desired user
+(void)getPlaylistsForUser:(PFUser *)user withCompletion:(void(^)(NSMutableArray *playlists))completion
{
    PFQuery *userQuery = [PFQuery queryWithClassName:@"Playlists"];
    [userQuery whereKey:@"userId" equalTo:[user objectId]];
    userQuery.cachePolicy = kPFCachePolicyCacheElseNetwork;
    [userQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error){
            NSMutableArray *playlists = [[NSMutableArray alloc]init];
            playlists = [objects mutableCopy];
                completion(playlists);
            }
    }];
}
+ (void)saveTrack:(NSDictionary *)track toPlaylist:(PFObject *)playlist withCompletion:(void(^)(BOOL success))completion
{
    [playlist addObject:track forKey:@"playlist"];
    [playlist saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (error)
        {
            NSLog(@"Error creating/saving playlist");
        }
        else{
            PFUser *current = [PFUser currentUser];
            PFQuery *playlistQuery = [PFQuery queryWithClassName:@"Playlists"];
            [playlistQuery whereKey:@"userId" equalTo:[current objectId]];
            [playlistQuery clearCachedResult];

            completion((BOOL)YES);
        }
    }];
}

本质上,我只是在需要查询重新加载数据时清除特定查询的缓存结果。我将查询的 cachePolicy 设置为 kPFCachePolicyCacheElseNetwork

这是进行缓存的最佳方式吗?似乎按预期工作。

【问题讨论】:

    标签: ios caching parse-platform


    【解决方案1】:

    看起来不错,但有点罗嗦。相反,如果不是查询本身,我会保留缓存策略的状态...

    @property (assign, nonatomic) PFCachePolicy cachePolicy;
    // initialize this to kPFCachePolicyIgnoreCache (==0 so it will be by default)
    
    // return a playlist query
    + (PFQuery *)playlistQueryForUser:(PFUser *)user {
        PFQuery *query = [PFQuery queryWithClassName:@"Playlists"];
        query.cachePolicy = self.cachePolicy;
        [query whereKey:@"userId" equalTo:[user objectId]];
        return query;
    }
    

    现在你的代码只需要一点点改变,而且更好一点,imo,因为它保存了清除缓存操作并明确表示你对缓存的意图。 (见 cmets 说“这里的差异”)...

    //Gets the playlists from the desired user
    +(void)getPlaylistsForUser:(PFUser *)user withCompletion:(void(^)(NSMutableArray *playlists))completion
    {
        // diff here...
        PFQuery *query = [self playlistQueryForUser:user];
        [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
            if (!error){
                NSMutableArray *playlists = [[NSMutableArray alloc]init];
                playlists = [objects mutableCopy];
                completion(playlists);
    
                // diff here...
                self.cachePolicy = kPFCachePolicyCacheThenNetwork;
            }
        }];
    }
    
    + (void)saveTrack:(NSDictionary *)track toPlaylist:(PFObject *)playlist withCompletion:(void(^)(BOOL success))completion
    {
        [playlist addObject:track forKey:@"playlist"];
        [playlist saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
            if (error) {
                NSLog(@"Error creating/saving playlist");
            } else {
                // diff here: no need to rebuild the query, just change policy...  
                self.cachePolicy = kPFCachePolicyIgnoreCache;
                completion((BOOL)YES);
            }
        }];
    }
    

    【讨论】:

    • 谢谢,这很有道理。为什么 xcode 不允许我写这一行 query.cachePolicy = self.cachePolicy;所有这些代码都在我正在编写的 API 中。
    猜你喜欢
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    相关资源
    最近更新 更多