我有一个静态UITableView,我希望使用HTTP请求(异步运行)检索数据。我尝试在几个地方发出HTTP请求,但每次来自请求的数据都来得太晚而且表视图没有填充。我发现填充表格视图的唯一方法是按以下方式调用reloadData
:
- (void)viewDidLoad
{
[super viewDidLoad];
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
_accountModel = [[CatapultAccount alloc] init];
[_accountModel getCurrentClient:^ (BOOL completed, NSDictionary *currentAccount) {
if (completed) {
_account = currentAccount;
[self.tableView reloadData];
} else {
UIAlertView *errorMessage = [[UIAlertView alloc] initWithTitle:@"Account retrieval unsuccessful"
message:@"Unable to retrieve current account information"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[errorMessage show];
}
}];
}
我试图在主线程上运行请求,但似乎它已经在主线程上运行了...我怀疑它是在getCurrentClient
内从后台运行的实际请求:< / p>
- (void)getCurrentClient:(void (^)(BOOL completed, NSDictionary *account))completion
{
__block BOOL operationSuccessful = NO;
__block NSDictionary *currentClient = nil;
NXOAuth2Account *currentAccount = [[[NXOAuth2AccountStore sharedStore] accounts] lastObject];
[NXOAuth2Request performMethod:@"GET"
onResource:[NSURL URLWithString:[NSString stringWithFormat:@"%@/clients/%@", kCatapultHost, currentAccount.userData[@"account_name"]]]
usingParameters:nil
withAccount:currentAccount
sendProgressHandler:nil
responseHandler:^ (NSURLResponse *response, NSData *responseData, NSError *error) {
if (error != nil) {
operationSuccessful = NO;
#if DEBUG
NSLog(@"ERROR: %@", error);
#endif
}
else {
operationSuccessful = YES;
NSError *jsonError;
currentClient = [NSJSONSerialization JSONObjectWithData:responseData
options:kNilOptions
error:&jsonError];
if (jsonError != nil) {
operationSuccessful = NO;
#if DEBUG
NSLog(@"Error: %@", jsonError);
#endif
}
}
completion(operationSuccessful, currentClient);
}];
}
我的方法(调用reloadData)是好的吗?是不是有办法让表视图控制器等待请求完成?
答案 0 :(得分:3)
不,你不能让表视图控制器等待。调用重新加载数据是来自Web服务的回调的正常模式。如果您在显示某些数据之前等待网络呼叫完成,那么您可以做很多事情。这里有一些想法......
您可能会在加载时显示进度指示器。
或者,如果在此之前有另一个视图控制器,则可以按下触发器加载数据的按钮,当请求完成时,它会将新的表视图控制器推送到屏幕上并准备好数据。
更高级的是在模型对象上使用键值观察(KVO)。您的表将使用模型对象作为其数据源。您从网络加载并使用结果填充模型对象。 KVO会处理通知静态表新数据已到达并且应该显示它(而不是重新加载整个表)...但是你在开始时仍然会有一个空白状态。