Ios 为什么可以';我不能重新装桌子吗

Ios 为什么可以';我不能重新装桌子吗,ios,objective-c,uitableview,restkit,Ios,Objective C,Uitableview,Restkit,我不熟悉iOS开发,也不熟悉iTableView 我的问题是,我正在用外部服务器的数据填充UITableView,但由于多线程,它不会等到数据到达后再加载表视图 我目前的想法是在加载数据时重新加载表视图 在前面的同一个类DailyBreakdown.c中,我用以下代码重新加载表视图: -(void)viewWillAppear:(BOOL)animated { [[self class] getAllActivities]; [super viewWillAppear:ani

我不熟悉iOS开发,也不熟悉iTableView

我的问题是,我正在用外部服务器的数据填充UITableView,但由于多线程,它不会等到数据到达后再加载表视图

我目前的想法是在加载数据时重新加载表视图

在前面的同一个类DailyBreakdown.c中,我用以下代码重新加载表视图:

-(void)viewWillAppear:(BOOL)animated
{

    [[self class] getAllActivities];

    [super viewWillAppear:animated];
    [self makeObjects];
    [self.tableView reloadData];
}
因此,在加载数据(使用Restkit)时的回调中,我尝试再次调用[self.tableView reloadData],但出现错误:

“struct objc_class”的定义必须从模块导入 “ObjectiveC.runtime”才是必需的

将Objective-C指针类型“Class”隐式转换为C指针 类型“struct objc_class*”需要桥接强制转换

下面是我从API返回活动对象的方法:

+(NSArray *)getAllActivities{

    if (allActivities == nil) {
        // Load the object model via RestKit
        //allActivities = [[NSMutableArray alloc] initWithObjects:@"Workout", @"Baked cake", @"Read for HR", nil];
        allActivities = [[NSMutableArray alloc] init];
        RKObjectManager *objectManager = [RKObjectManager sharedManager];

        [objectManager getObjectsAtPath:@"/activities"
                             parameters:nil
                                success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                                    //allActivities =  [mappingResult array];
                                    allActivities = [NSMutableArray arrayWithArray: [mappingResult array]];
                                    [[self class] makeObjects];

                                    /*** THIS LINE IS THE PROBLEM **/
                                    [self.tableView reloadData];
                                }
                                failure:^(RKObjectRequestOperation *operation, NSError *error) {
                                    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                                                    message:[error localizedDescription]
                                                                                   delegate:nil
                                                                          cancelButtonTitle:@"OK"
                                                                          otherButtonTitles:nil];
                                    [alert show];
                                    NSLog(@"Hit error: %@", error);
                                }];
    }

    return allActivities;

}
那么,为什么我不能像以前那样调用[self.tableView reloadData]?我将如何在我的类方法中实现这一点

此外,除了重新加载tableview之外,还有更好的方法来实现这一点吗?可能是线程锁定,以便加载视图时allActivities不会返回nil?欢迎提出任何意见


谢谢

getAllActivities
是一个类方法,因此您不能从中访问属性和实例方法。最简单的解决方案是将其作为实例方法。在我看来,考虑到您的情况(尝试访问
tableView
属性),此更改是正确的

这个问题的另一个解决方案是:

  • 您可以向
    getAllActivities
    添加一个块参数,当对外部服务的调用成功完成时将调用该块参数;在此块中,您将重新加载表
  • 您可以将实例的
    self
    传递给
    getAllActivities
    ,并使用它访问
    tableView

我还注意到一件事-
返回所有活动
不会包含上次RestKit调用的结果,因为它将在调用完成之前执行。

您的
getAllActivities
方法被定义为类级方法(因为它的前缀是加号)。您可能想做的是定义一个实例级方法(用减号代替加号)

我注意到的下一件事是,你没有对通话结果做任何处理,结果也不是你所期望的。RKObjectManager的getObjectsAtPath是异步的,将立即返回。这意味着allActivities的值几乎总是一个空数组。因此,您可以进一步将您的方法重新定义为:

-(void)getAllActivities{
   //...
   //No return here!
}
最后,因为你的方法根本不是真正的“获取”活动,你可以考虑把它命名为:

-(void)reloadAllActivities

工作!非常感谢。类方法和实例方法之间的差异暗指我,因此我必须对此进行研究。但现在,我的tableView中充满了服务器数据,这是一个巨大的里程碑!非常感谢。这里很好地解释了Objective-C中的实例和类方法
-(void)reloadAllActivities