iOS: установка цвета фона UIView вне цикла выполнения - PullRequest
3 голосов
/ 05 ноября 2010

Я бы хотел, чтобы события, запущенные в потоке, посвященном аудио, меняли пользовательский интерфейс. Простой вызов view.backgroundColor, похоже, не имеет никакого эффекта.

Вот два метода в моем viewController. Первый вызван прикосновениями. Второй вызывается из аудиокода. Первые работы. Второй. Есть идеи почему?

// this changes the color
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    [touchInterpreter touchesMoved:touches withEvent:event];
    self.view.backgroundColor = [UIColor colorWithWhite: 0.17 + 2 *  [patch getTouchInfo]->touchSpeed alpha:1];

};

// this is called from the audio thread and has no effect
-(void)bang: (float)intensity{
    self.view.backgroundColor = [UIColor colorWithWhite: intensity alpha:1];
}

Есть идеи, почему? Я просто делаю что-то глупое или есть хитрость в изменении элементов пользовательского интерфейса вне цикла выполнения?

1 Ответ

6 голосов
/ 05 ноября 2010

Не допускается касание пользовательского интерфейса чем-либо, кроме основного потока, что приведет к странному поведению или сбоям. На iOS 4.0 или более поздней версии вы должны использовать что-то вроде

- (void)bang:(float)intensity {
    dispatch_async(dispatch_get_main_queue(), ^{
        self.view.backgroundColor = [UIColor colorWithWhite:intensity alpha:1];
    });
}

Или вариант NSOperationQueue

- (void)bang:(float)intensity {
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        self.view.backgroundColor = [UIColor colorWithWhite:intensity alpha:1];
    }];
}

В iOS 3.2 или более ранней версии вы можете использовать [self performSelectorOnMainThread:@selector(setViewBackgroundColor:) withObject:[UIColor colorWithWhite:intensity alpha:1] waitUntilDone:NO], а затем просто определить

- (void)setViewBackgroundColor:(UIColor *)color {
    self.view.backgroundColor = color;
}

Обратите внимание, что вызов [self.view performSelectorOnMainThread:@selector(setBackgroundColor:) withObject:[UIColor colorWithWhite:intensity alpha:1] waitUntilDone:NO] небезопасен, поскольку свойство view UIViewController не является поточно-ориентированным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...