parse.com PFQueryTableViewController多次返回同一个对象

时间:2014-01-08 16:01:34

标签: ios parse-platform pfquery

我正在尝试使用(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object自定义PFObjectPFQueryTableViewController数据的显示。因此,我在我的PFQuery (PFQuery *)queryForTable PFQueryTableViewController中构建了我的delegate对象,该对象应该在NSArray中获取多个对象。

我认为parse.com应该为每个返回的对象发送/调用(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object一次。但是,我发现它一直多次返回相同的对象。

因此,例如,调用3次(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object而不是3个不同的对象,我得到相同的对象。但这不是数据或查询的问题,因为在(PFQuery *)queryForTable的末尾,就在

之前
return query;

我试过

[query findObjectsInBackgroundWithBlock:^(NSArray *resultsNow,NSError *error) {NSLog(@"We have the following: %@", resultsNow);}];
 sleep(5);

这表明正确获得了3个对象。当PFQueryTableViewController调用(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object 3次处理时,确切的相同的查询是怎样的,而不是逐个发送3个对象,它会发送第一个3次?

在回答Wain的问题时,我在评论中添加了一些答案,但以下内容似乎也很相关:

- (PFObject *)objectAtIndex:(NSIndexPath *)indexPath {
// overridden, since we want to implement sections
if (indexPath.section < self.objects.count) {
    return [self.objects objectAtIndex:indexPath.section];
}

return nil;
}

2 个答案:

答案 0 :(得分:2)

我有类似的问题,我做的是:

1 - 不要使用PFQueryTableViewController,而只使用常规UITableViewController

2 - 将方法queryForTable:更改为(void)

- (void)queryForTable {

3 - 删除PFQueryTableView方法并实施DataSource方法。

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    {
    }
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
    }

在.h文件中声明后,在[self queryForTable]中呼叫viewDidLoad

如果您不使用阻止,只需创建NSArray property并填充queryForTable

self.yourarray = [query findobjects];

如果您使用阻止,只需确保在阻止内填充NSArray并重新加载tableview。

[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {

    if (error) {
        // There was an error, do something with it.
    }
    else {
        self.yourArray = objects;
    }
    // Reload your tableView Data
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.tableView reloadData];
    }); 
}];

这就是我的工作方式。希望它有所帮助。

答案 1 :(得分:1)

感谢Wain的问题,我记录了objectsDidLoad:并发现加载了正确的3个对象,因此它必须是PFQueryTableViewController的问题,而不是在(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object中以正确的顺序加载它们。

特别是,如我的问题所示,映射应该在-(PFObject *)objectAtIndex:(NSIndexPath *)indexPath中。但是在查看第N次的文档时,我突然发现方法名称实际上应该是-(PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath。难怪它没有被调用,我的映射生效了,因此错误的对象被传递给(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object。当我将其更改为-(PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath时,问题就消失了!

我怎么能得到错误的方法名称?我发现我从anypic代码复制了那个映射示例,所以我猜测parse.com在写入anypic之后的某个时候改变了方法名称?任何人都可以验证吗?我正在使用解析框架1.2.14