关于ios:为什么我不能重装我的桌子

Why can't I reload my table

我是iOS开发的新手,正在与合适的视图搏斗。

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

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

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

1
2
3
4
5
6
7
8
9
-(void)viewWillAppear:(BOOL)animated
{

    [[self class] getAllActivities];

    [super viewWillAppear:animated];
    [self makeObjects];
    [self.tableView reloadData];
}

因此,在加载数据时(使用restkit)回调时,我尝试再次调用[self.tableview reloaddata],但得到了错误:

Definition of 'struct objc_class' must be imported from module
'ObjectiveC.runtime' before it is required

Implicit conversion of Objective-C pointer type 'Class' to C pointer
type 'struct objc_class *' requires a bridged cast

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
+(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方法被定义为类级方法(因为它的前缀是加号)。您可能要做的是定义一个实例级方法(用减号代替加号)。

1
-(NSArray *)getAllActivities

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

1
2
3
4
-(void)getAllActivities{
   //...
   //No return here!
}

最后,由于您的方法根本没有"获得"活动,因此您可以考虑将其命名为:

1
-(void)reloadAllActivities

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

此问题的其他解决方案:

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

还有一件事我注意到了——return allActivities;不包含上次restkit调用的结果,因为它将在调用完成之前执行。