具有网络可达性的 PFQueryTablViewController queryForTable 方法

Posted

技术标签:

【中文标题】具有网络可达性的 PFQueryTablViewController queryForTable 方法【英文标题】:PFQueryTablViewController queryForTable method with network reachability 【发布时间】:2015-08-25 18:31:53 【问题描述】:

我正在尝试使用 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 中实现可达性。

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

我知道这个方法应该自动将它获取的对象分配给行,但是如果我们传递一个 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 的方式。

所以我的问题:

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

【问题讨论】:

【参考方案1】:

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

    一旦您进入 cellForRowAtIndexPath 方法,您就可以调用 objectAtIndexPath: 给您所需的对象,然后使用其中的数据来设置您的单元格。

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
        PFObject *object = [self objectAtIndexPath:indexPath];
    
        UITableViewCell *cell = ....
    
        //configure cell using object here
    
        return cell;
    
    

    你这样做(半伪代码)

    -(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;
    
    

【讨论】:

我应该在哪里处理可达性和从本地数据存储中获取?我应该覆盖加载对象吗? 在视图加载时覆盖可达性?加载对象也应该工作。 所以我应该重写加载对象并将从本地数据存储加载的代码放入其中,如果本地数据存储为空,则从云中加载? 是的,但老实说,我会为此使用常规的 uitableviewcontroller。 PFQueryTableViewController 的功能让一切变得混乱。

以上是关于具有网络可达性的 PFQueryTablViewController queryForTable 方法的主要内容,如果未能解决你的问题,请参考以下文章

具有可达性的连接状态

ios上网络类型的可达性错误检查

实时检查网络可达性

始终检查 Cocoa 中的网络可达性

iPhone 上的网络可达性

AFNetworking 可达性在网络状态改变时显示 UIView