在填充静态表视图之前等待HTTP Web请求完成

时间:2013-04-30 19:23:08

标签: ios objective-c httpwebrequest

我有一个静态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)是好的吗?是不是有办法让表视图控制器等待请求完成?

1 个答案:

答案 0 :(得分:3)

不,你不能让表视图控制器等待。调用重新加载数据是来自Web服务的回调的正常模式。如果您在显示某些数据之前等待网络呼叫完成,那么您可以做很多事情。这里有一些想法......

您可能会在加载时显示进度指示器。

或者,如果在此之前有另一个视图控制器,则可以按下触发器加载数据的按钮,当请求完成时,它会将新的表视图控制器推送到屏幕上并准备好数据。

更高级的是在模型对象上使用键值观察(KVO)。您的表将使用模型对象作为其数据源。您从网络加载并使用结果填充模型对象。 KVO会处理通知静态表新数据已到达并且应该显示它(而不是重新加载整个表)...但是你在开始时仍然会有一个空白状态。