【问题标题】:iOS+ Parse.com : kPFCachePolicyCacheThenNetwork, retrieve data two timesiOS+ Parse.com : kPFCachePolicyCacheThenNetwork,两次检索数据
【发布时间】:2013-06-05 23:59:16
【问题描述】:

我使用 Parse.com

构建了一个 iOS 应用程序

我想先从缓存然后从网络

检索数据

为此,我使用了 kPFCachePolicyCacheThenNetwork 缓存策略,这符合我的要求。

PFQuery *employesquery = [PFQuery queryWithClassName:@"employesTable"];
    [employesquery whereKey:@"UserID" equalTo:[PFUser currentUser]];
    [employesquery includeKey:@"empID"];
    [employesquery includeKey:@"empID.user"];

    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view  animated:YES];


//APPLIES CACHE... ********
        employesquery.cachePolicy = kPFCachePolicyCacheThenNetwork;

    [employesquery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        [hud hide:YES];
        NSMutableArray *empData = [[NSMutableArray alloc] init];
        for (PFObject *object in objects)
        {
            //Getting Data For Item
            PFObject *employeeObject = [object objectForKey:@"empID"];
            [empData addObject:employeeObject];
        }
        [self fetchEmployeeData:empData];

    }];

但是使用这个每个数据检索两次,可重复的数据。

如何避免这种重复数据,

一旦从网络获取数据,之前显示的数据(使用缓存)就会被清除/隐藏。

我试过[PFQuery clearAllCachedResults];

清空所有缓存,使得下一次迭代的缓存中没有数据。

【问题讨论】:

    标签: iphone ios objective-c caching parse-platform


    【解决方案1】:

    当使用kPFCachePolicyCacheThenNetwork 作为您的缓存策略时,您的回调总是被触发两次。这是因为策略是使用缓存然后去网络,而不是独占使用缓存。

    解决方案是跟踪您的块被调用了多少次,这样您就可以确定您是从网络获取缓存的结果还是新的结果。解析有more information about this here

    【讨论】:

      【解决方案2】:

      您必须清除用于存储块 findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) 中的 parse 查询的对象的数据数组。

      - (void)refreshData
      {
          PFUser *currentUser = [PFUser currentUser];
      
          NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%@ = '%@' OR %@ = '%@'",
                                                                 kMessageUserSendIdKey, currentUser.objectId,
                                                                 kMessageUserReceiveIdKey, currentUser.objectId]];
      
      PFQuery *query = [PFQuery queryWithClassName:kMessageClassKey predicate:predicate];
      [query addDescendingOrder:kMessageTimeCreatedKey];
      [query includeKey:kMessageUserSendKey];
      [query includeKey:kMessageUserReceiveKey];
      [query setCachePolicy:kPFCachePolicyCacheThenNetwork];
      
      [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
          if (!error) {
              // TODO: Clear the data array
              self.messagesDataArray = [NSMutableArray new];
      
              if (objects.count > 0) {
                  [self.messagesDataArray addObject:objects[0]];
                  for (int i = 1; i < objects.count; i++) {
                      PFObject *messageChat = [objects objectAtIndex:i];
                      if (![self isExistWithMessageChat:messageChat]){
                          [self.messagesDataArray addObject:messageChat];
                      }
                  }
                  [self.tableView reloadData];
              }
           }
           else {
              NSLog(@"Error: %@ %@", error, [error userInfo]);
           }
         }];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-26
        • 2014-02-13
        相关资源
        最近更新 更多