0

我正在尝试使用 Parse 后端的 Question 对象填充 PFQueryTableViewController。如何在此方法中实现块?

- (PFQuery *)queryForTable  // I'm having issues with using the method "findObjectInBackgroundWithBlock" in this method.
{
    PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];

    [query fromLocalDatastore];
    [query orderByDescending:@"createdAt"];

    [query findObjectsInBackgroundWithBlock:^(NSArray *parseQuestions, NSError *error) { // Fetch from local datastore
        if (parseQuestions != nil) {
            NSMutableArray *mutableParseQuestions = [parseQuestions mutableCopy];
            self.questions = mutableParseQuestions;  // if Set local array to fetched Parse questions

        } else {

            if ([InternetReachabilityManager isReachable]) {

                [query findObjectsInBackgroundWithBlock:^(NSArray *parseQuestions, NSError *error) { // Fetch from Cloud
                      NSMutableArray *mutableParseQuestions = [parseQuestions mutableCopy];
                      self.questions = mutableParseQuestions;  // if Set local array to fetched Parse questions
                      [Question pinAllInBackground:parseQuestions];  // Save query results to local datastore

                }];
            }
        }
    }];

    return query;
}

当块在此方法中时,我收到此错误。 在此处输入图像描述

这是因为 queryForTable 已经是后台进程了吗?我应该使用

[查询 findObjects]

另外,我正在尝试在我的 fetch 中实现可达性。

  1. 尝试从本地数据存储中获取
  2. 如果数据存在则将数据加载到表中,否则切换到网络
  3. 如果网络可用,则调用阻止
  4. 将网络获取的结果保存到本地数据存储中

我知道这个方法应该自动将它获取的对象分配给行,但是如果我们传递一个 PFObject 子类对象,我不知道如何使用它。这是我对数组的解释。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    self.question = [self.questions objectAtIndex:indexPath.row]; // Save one question from row

    static NSString *identifier = @"QuestionsCell";

    QuestionsCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    if (cell == nil) {
        cell = [[QuestionsCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
    }

    [cell setQuestion:self.question];  //

    return cell;
}

这就是我使用获取的数组来填充 tableView 的方式。

所以我的问题:

  1. 为什么我不能在 queryForTable 中调用块?
  2. 有什么方法可以通过使用 queryForTable 将对象自动分配给行来使这更简单吗?
  3. 如果无法访问互联网并且本地数据存储为空,我该怎么办?
4

1 回答 1

0
  1. 没有理由在该函数中调用您的查询。您应该创建一个查询然后返回它。PFQueryTableViewController 对请求进行实际处理。在此处阅读文档:https ://parse.com/docs/ios/api/Classes/PFQueryTableViewController.html#//api/name/queryForTable

  2. 进入 cellForRowAtIndexPath 方法后,您可以调用 objectAtIndexPath: 为您提供所需的对象,然后使用其中的数据设置您的单元格。

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        PFObject *object = [self objectAtIndexPath:indexPath];
    
        UITableViewCell *cell = ....
    
        //configure cell using object here
    
        return cell;
    }
    
  3. 你这样做(半伪代码)

    -(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section {
        if (self.objects.count == 0) {
            Put some sort of overlay that shows there are no objects to be retrieved or internet is unreachable.
        }
        return self.objects.count;
    }
    
于 2015-08-25T20:53:17.797 回答