请求完成后重新加载表

时间:2016-03-04 02:49:58

标签: objective-c uitableview nsurlsession

我有一个表视图,它使用以NSURLSession作为数据源获取数据的结果。这是我的NSArray,负责该表。

@property (strong, nonatomic) NSMutableArray *results;

这是我的委托和数据源方法

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [_results count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

    // Configure the cell...
    WordResult *word = (WordResult *)[_results objectAtIndex:indexPath.row];
    cell.textLabel.text = word.defid;

    return cell;
}

在我的viewDidLoad中,我从Mashape获取了请求,并尝试将结果映射到我的自定义类WordResult 这是我的获取方法

#pragma mark - GET Request
- (void)fetchDataFromMashape:(NSURL *)URL {
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
    [request setHTTPMethod:@"GET"];
    [request setValue:API_KEY_MASHAPE forHTTPHeaderField:API_MASHAPE_HEADER_1];
    [request setValue:API_ACCEPT forHTTPHeaderField:API_MASHAPE_HEADER_2];

    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSDictionary *jsonResult = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        self.results = [self processResultData:jsonResult];
    }];

    [task resume];
}

- (NSMutableArray *)processResultData:(NSDictionary *)dict {

    NSArray *list = [dict objectForKey:@"list"];
    NSMutableArray *tempListOfWord = [[NSMutableArray alloc] init];

    if (list) {
        for (NSDictionary *item in list) {
            WordResult *word = [[WordResult alloc] initWithDictionary:item];
            [tempListOfWord addObject:word];
        }
    }

    NSLog(@"Result array of word: %@", tempListOfWord);
    return tempListOfWord;
}

我的问题是,在我的结果数组被fetch方法分配后,我不知道在哪里重新加载数据,并且忽略了我在viewDidLoad上显示的进度HUD。 这是我的viewDidLoad

- (void)viewDidLoad {
    [super viewDidLoad];

    [SVProgressHUD show];
    [self fetchDataFromMashape:_finalURLrequest];

}

那么在我的请求完成后我应该在哪里放[SVProgressHUD dismiss][self.tableView reloadData]? 任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:1)

在主线程上重新加载表

dispatch_async(dispatch_get_main_queue(), ^{
    [_tableView reloadData];
});

答案 1 :(得分:0)

试试这个:

您可以在[SVProgress dismmis]

之后添加[self.tableView reloadData]并重新加载您的tableview self.results = [self processResultData:jsonResult];

答案 2 :(得分:0)

一个出色的tableView编码模式是将reload调用setters模型对象,然后您就不会错过任何数据更改。例如,在您的情况下result的setter:

-(void)setResult:(NSMutableArray*)result{
  _result = result;
  [self.tableView reloadData]
  [SVProgressHUD dismiss]
}

答案 3 :(得分:0)

在调用fetchdata之前的viewdidload中执行

self.results=[[NSMutableArray alloc]init];

然后在为数组分配数据

后,在完成块内调用[self.tableView reloadData]

然后在获取数据函数中的[task resume]之后调用块外的svprogress hud hide方法