2016-06-23 9 views
0

Ok. Поэтому я пытаюсь использовать GCD для обработки всей тяжелой нагрузки до перехода к следующему контроллеру. Я открываю большой архив Файлы и извлекаю их, что занимает некоторое время.лучший способ использования GCD для нарезания резьбы

Весь процесс выглядит так:

Нажмите> индикатор отображения активности UICollectionViewCell> Пусть НОД заботиться о тяжелом погрузочной> селектора перехода вызова с использованием performSelector: onThread: .....

Проблемы когда я использую mainThread, переход происходит слишком быстро, и вся загружаемая загрузка не срабатывает, пока через некоторое время и переход не будет выглядеть ужасно, и при использовании currentThread, ну, это займет столько времени, кажется, что ужасно приложение.

-(void)someMethod 
{  
    //activity Indicator before transition begins 
    UIActivityIndicatorView *activity=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
    [activity setFrame:self.view.bounds]; 
    [self.view addSubview:activity]; 
    [self.view bringSubviewToFront:activity]; 
    activity.hidesWhenStopped=YES; 
    [activity startAnimating]; 

    dispatch_queue_t transitionQueue; 
    transitionQueue = dispatch_queue_create("com.app.transitionQueue", NULL); 

    dispatch_async(transitionQueue,^{ 
      //heavy lifting code 
     viewerPVC=..... 

     dispatch_async(dispatch_get_main_queue(),^{ 
     [activity stopAnimating]; 
     [self transitionToMangaViewer:mReaderPVC]; 
     }); 
    }; 
} 
-(void)transitionToViewer:(ViewerPVC*)viewerPVC 
{ 
    [self.navigationController pushViewController:mReaderPVC animated:YES]; 
} 

Так Пробовал первое предложение, но переход по-прежнему кажется, багги, так как CollectionViewController до сих пор остаются на фоне некоторое время после перехода

+0

Независимо от того, какая нить выполняет загрузку, потребуется столько же времени; что зависит от производительности вашей сети. Если вы не можете предварительно извлечь данные, то все, что вы можете сделать, это обеспечить хорошую обратную связь с пользователем. Я замечаю, что вы выполняете обновления пользовательского интерфейса (например, останавливаете представление активности) в фоновом потоке. Вы должны отправить эти действия в основную очередь. Что вы пытаетесь сделать с NSThread? Вы вообще никогда не используете этот класс – Paulw11

ответ

2

Вы не должны должны использовать NSThread при использовании НОД, попробовать что-то вместо этого

dispatch_async(transitionQueue,^{ 
    //heavy lifting code 
viewerPVC=..... //this should block here otherwise will not work 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [activity stopAnimating]; 
     [self transitionToAnotherViewer:viewerPVC]; 
    }); 
}); 
+1

, вы также можете использовать 'dispatch_async (dispatch_queue_create (DISPATCH_QUEUE_PRIORITY_BACKGROUND, NULL),^{', поэтому вам не нужно создавать собственную очередь – Fonix

1

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

dispatch_async(transitionQueue,^{ 
     //heavy lifting code 
     viewerPVC=..... 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      [activity stopAnimating]; 

      [self performSelector:@selector(transitionToAnotherViewer:) withObject:viewerPVC waitUntilDone:YES]; 
     }); 

    }; 

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

  • Нет связанных вопросов^_^