2015-05-25 3 views
0

Я новичок в разработке приложений ios и задаю общий вопрос о дизайне приложений, касающихся отзывчивости пользовательского интерфейса. Должен ли всегда существовать отдельный поток для работы с материалом UI? Например, я работаю над простой игрой, которая всегда должна обнаруживать жесты пальцев, кроме того, что происходит постоянная работа, например, обновление экрана с помощью движущихся объектов и их анимация (хотя блокирующих вызовов нет). Приложение, как правило, работает хорошо, но я заметил, что иногда он не обнаруживает жест жестов и задается вопросом, является ли причиной то, что я делаю все в основном потоке.ios app design для отзывчивого UI

Должен ли я обрабатывать жесты салфетки в основной нити и делать все остальное в отдельной теме? Как насчет анимации, должна ли каждая анимация иметь собственный поток? А также о циклах запуска, лучше в этом случае нить или цикл запуска? (Я все еще запутался, где использовать runloops даже после прочтения некоторых материалов об этом в Интернете)

+1

Вы можете обновить интерфейс только в основной теме. Вычисление может производиться в другом потоке, но обновление UI не выполняется. – Larme

+0

Чтобы обновить интерфейс, я использую периодические таймеры, означает ли это, что таймеры также будут в основном потоке? и как быть с обработчиками жестов, если они будут обрабатываться в отдельном потоке (а не в основном потоке)? – comatose

ответ

0

Лучший способ получить отзывчивый интерфейс, запустив связанные с UI события и события фона на двух отдельных потоках. Для анимации не нужно использовать в отдельном потоке. Хотя у вас есть преимущество использования потоков, попробуйте минимизировать использование потоков больше. Только когда вы имеете дело с пользовательским интерфейсом и фоном, выбирающим события @ time, это будет полезно.

1

Предлагаю посмотреть на NSOperationQueue как на лучшее сочетание простоты и функциональности. (GCD еще проще для простых вещей, но почти невозможно контролировать по мере увеличения ваших требований.)

Общая схема состоит в получении ввода (в основном потоке), перемещении его обработки на задний план вместе с запросом на возврат в основной поток обновлений UI. Вот шаблон для того, как он может быть структурирован:

@interface QueueUser : NSObject 
@property (nonatomic, strong) NSOperationQueue *workQueue; 
@end 

@implementation QueueUser 
- (instancetype)init { 
    self = [super init]; 
    if (self) { 
     _workQueue = [[NSOperationQueue alloc] init]; 
     _workQueue.maxConcurrentOperationCount = 1; 
     _workQueue.name = @"ca.philmills.Test-Background"; 
    } 
    return self; 
} 

- (void)handleInput { 
    [self.workQueue addOperationWithBlock:^{ 
     // Do work that may take some time 
     // --> 

     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
      // Update the UI 
      // --> 

     }]; 
    }]; 
} 
@end