2016-03-04 2 views
1

У меня есть табличный вид, который использует результат выборки данных с NSURLSession в качестве источника данных. Вот мой NSArray, который отвечает за эту таблицу.Перезагрузка таблицы после запроса завершена

@property (strong, nonatomic) NSMutableArray *results; 

И это мой делегат и метод DataSource

#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; 
} 

Моя проблема: я не знаю, где перезагрузить данные после того, как массив результатов был назначен d методом fetch и отклонить мой прогресс HUD, который я показал на моем viewDidLoad. Вот мой viewDidLoad

- (void)viewDidLoad { 
    [super viewDidLoad]; 

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

} 

Так где я должен поставить [SVProgressHUD dismiss] и [self.tableView reloadData] после моего запроса была закончена? Любая помощь будет оценена по достоинству.

+0

Вы должны уволить ваш [SVProgressHUD увольняют] над возвратом, а затем перезагрузите таблицу. [0]. –

+0

Уже пробовал в моей 'processResultData' прямо перед возвратом, но он не работает @KamleshShingarakhiya –

ответ

1

Reload таблицу на основной поток

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

Спасибо, Васиф Сауд. Я сделал это в главной очереди, и это работает! –

0

Попробуйте это:

Вы можете поставить [SVProgress dismmis], а также перезагрузить TableView [self.tableView reloadData] после self.results = [self processResultData:jsonResult];

+0

Это работа, Камлеш Шингарахия –

+0

STRANGE. Вы получили этот журнал NSLog (@ «массив результатов слова:% @», tempListOfWord); ? –

+0

Ya, Он показал, как должен. –

0

Отличный шаблон кодирования Tableview ставит reload вызов setters объектов модели, то вы не пропустите ни одного изменения данных. Например, сеттер для result в вашем случае:

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

В вашем viewdidload перед вызовом fetchdata сделать

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

И затем вызвать ваш [self.tableView reloadData] в блоке завершения после назначения массива с данными

И затем вызовите метод svprogress hud hide вне блока после [task resume] в функции данных выборки

Смежные вопросы