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 requiredImplicit 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?欢迎有任何想法。
谢谢!
您的
1 | -(NSArray *)getAllActivities |
我注意到的下一件事是,您既没有对调用的结果做任何处理,也没有对结果进行您所期望的处理。RKObjectManager的getObjectsAtPath是异步的,将立即返回。这意味着AllActivities的值几乎总是一个空数组。因此,您可以进一步将方法重新定义为:
1 2 3 4 | -(void)getAllActivities{ //... //No return here! } |
最后,由于您的方法根本没有"获得"活动,因此您可以考虑将其命名为:
1 | -(void)reloadAllActivities |
此问题的其他解决方案:
- 您可以向
getAllActivities 添加一个块参数,当对外部服务的调用成功完成时将调用该参数;在此块中,您将重新加载表 - 您可以将实例的
self 传递给getAllActivities 并使用它访问tableView 。
还有一件事我注意到了——