2016-06-06 2 views
0

У меня есть UITableView, который показывает список фильмов. (Название и идентификатор фильма хранятся в предварительно заполненном массиве).Запустить фоновый поток до UITableView Segues

Когда я нажимаю на строку, я хочу, чтобы приложение зашло в фоновый режим ПЕРЕД СЕГЕИНГОМ, загрузите «информацию о фильме» И ТОГДА на новый взгляд после завершения фонового потока. Загрузка информации прекрасна, поэтому я не учитываю эту часть кода.

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

Любая помощь?

В моем UITableViewController классе

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
     MovieDetailsViewController *mvc = (MovieDetailsViewController*)segue.destinationViewController; 
     mvc.movie = movie; 
    } 

    - (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender { 
    //I KNOW THAT IF THIS RETURNS TRUE prepareForSegue is called 
    bool canSegue = NO: 
     if ([identifier containsString:@"seg_movie"]) { 

      // SHOW Activity spinner 

       [self doMovieLookup]; 

       if (movie != nil) { 
        canSegue = YES; 
       } 
     } 
     return canSegue; 

    } 



- (void) doMovieLookup { 
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     //HERE I AM COMMUNCATING WITH THE SERVER AND PARSING JSON RESULTS INTO A DICTIONARY 
     //this code works fine then I send the JSON results on to object creation. 
     [self buildMovieWithDictionary:[[dictionaryResults objectForKey:@"Movie"] objectAtIndex:0]]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      //DO I NEED SOMETHING HERE? 

      //STOP SPINNER 

     }); 

    }); 

} 

Просто метод, который создает объект Movie упаковывает кто был диковинкой.

- (void) buildMovieWithDictionary : (NSDictionary*) dictionary { 
    movie = [[Movie alloc] init]; 
    movie.title = [dictionary objectForKey:@"MovieTitle"]; 
    movie.description = [dictionary objectForKey:@"MovieTitle"]; 
    movie.releasedate = [dictionary objectForKey:@"MovieTitle"];  
} 

ответ

1

Вы близки, но немного из того, я думаю. Вместо того, чтобы звонить doMovieLookup в shouldPerformSegueWithIdentifier:sender:, попробуйте сделать это в tableView:didSelectRowAtIndexPath.

Затем вы можете позвонить в performSegueWithIdentifier:sender:, где вы делаете свой dispatch_async звонок обратно в основной поток.

+1

Спасибо! Для тех, кто подходит к этой теме в будущем, в IB я удалил segue из ячейки и сделал segue из View Controller к новому контроллеру представления назначения, а затем использовал предложение Wyatt's PerformanceSegueWithIdentifer. –

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