具有网络可达性的 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 方法的主要内容,如果未能解决你的问题,请参考以下文章