2012-02-23 2 views
1
- (void)fetchImages { 
    if (self.profileImages == nil) { 
     self.profileImages = [[NSMutableDictionary alloc] initWithCapacity:200]; 
    } 
    dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
     for (id tweet in self.timeline) { 
      TWRequest *fetchUserImageRequest = [[TWRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://api.twitter.com/1/users/profile_image/%@", [tweet valueForKeyPath:@"user.screen_name"]]] parameters:nil requestMethod:TWRequestMethodGET]; 
      [fetchUserImageRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { 
       if ([urlResponse statusCode] == 200) { 
        [self.profileImages setObject:[UIImage imageWithData:responseData] forKey:[tweet valueForKeyPath:@"user.screen_name"]]; 
        NSArray *indexPath = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:[self.timeline indexOfObject:tweet] inSection:0]]; 
        [self.tableView reloadRowsAtIndexPaths:indexPath withRowAnimation:UITableViewRowAnimationNone]; 
       } 
      }]; 
     } 
    }); 
} 

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

    // configure cell 
    id tweet = [self.timeline objectAtIndex:[indexPath row]]; 
    UILabel *tweetLabel = (UILabel *)[cell viewWithTag:102]; 
    tweetLabel.text = [tweet objectForKey:@"text"]; 
    UILabel *usernameLabel = (UILabel *)[cell viewWithTag:101]; 
    usernameLabel.text = [tweet valueForKeyPath:@"user.name"]; 
    UIImageView *profileImage = (UIImageView *)[cell viewWithTag:100]; 
    profileImage.image = [self.profileImages objectForKey:[tweet valueForKeyPath:@"user.screen_name"]]; 
    UILabel *dateLabel = (UILabel *)[cell viewWithTag:103]; 
    NSString *labelString = [[tweet objectForKey:@"created_at"] substringToIndex:10]; 
    dateLabel.text = labelString; 

    return cell; 

} 

Я получаю временную шкалу, а затем хочу получить изображения профиля для всех пользователей на временной шкале. Мне нужно пройти через твиты и получить изображение. Мне любопытно, как я могу определить, когда все изображения были извлечены, а затем перезагрузить tableview. На данный момент этого не происходит. TWRequest запускается после перезагрузки таблицы. Что я здесь делаю неправильно? Может быть, есть лучший способ сделать это?TWRequest in background

Большое спасибо.

+0

Я обновил метод выше, чтобы отразить то, что он в настоящее время стоит, как, когда я получаю ошибку ниже. – kschins

+0

Отредактировал свой ответ, забудьте о beginUpdates/endUpdates. Думаю, теперь все должно быть решено. – fbernardo

+0

Да, я не знаю. Это также то, что я пробовал, так как я знаю, что обновления пользовательского интерфейса должны обрабатываться основным потоком, но с той же ошибкой. Мне придется исследовать его немного больше по своему усмотрению. Я не уверен, почему обновление табличного представления несовместимо. Этот метод должен быть в порядке. – kschins

ответ

1

Это потому, что [TWRequest performRequestWithHandler:] является асинхронным методом. Зачем вам нужно перезагружать всю таблицу? Почему бы просто не перезагрузить ячейку при получении изображения (в конце блока обработчика).

Если вы действительно хотите перезагрузить всю таблицу, просто держите подсчет всех ваших завершенных запросов и перезагрузите таблицу, когда все будет сделано.

Если вы хотите, чтобы перезагрузить одну ячейку вы можете сделать что-то вроде:

dispatch_sync(dispatch_queue_get_main(), ^{ 

    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:0]; 

} 
+0

Я получаю только обновление определенной строки, но вызываю [self.tableView reloadRowsAtIndexPaths: withRowAnimation:]; не работает, так как нет возможности сохранить индекс какой строки для обновления, так как эта переменная не обновляется на надежных основаниях. – kschins

+0

Не будет ли строка такой, как [NSIndexPath indexPathForRow: [self.timeline indexForObject: tweet] inSection: 0]? – fbernardo

+0

Да, мне удалось получить эту информацию, чтобы обновить правильную строку, но она все равно бросает эту ошибку при попытке обновить таблицу - «Неверное обновление табличного представления». Приложение запросило обновление табличного представления, которое несовместимо с состоянием предоставляемый источником данных ». – kschins