2013-06-22 2 views
0

Это действительно заводит меня с ума.UI не обновляется в основной теме

У меня есть кнопка, и если эта кнопка будет затронута, она вызовет метод, который обновляет пользовательский интерфейс. Вот этот метод:

- (void)loadLevelWithImagePath:(NSString *)imagePath difficulty:(int)difficulty modelName:(NSString *)modelName 
{ 
    // do stuffs 
} 

За исключением того, что это не так.

Однако, когда я прилагаю все тело метода в:

dispatch_async(dispatch_get_main_queue(), ^{ 
    // do stuffs 
} 

Это работает!

Однако я сбив с толку, потому что, когда я устанавливаю точку останова в методе, в соответствии с отладчиком она уже находится в основном потоке. Также если я поставлю эти 2 чека:

- (void)loadLevelWithImagePath:(NSString *)imagePath difficulty:(int)difficulty modelName:(NSString *)modelName 
{ 
    NSLog(@"%d", [NSThread currentThread] == [NSThread mainThread]); 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     NSLog(@"%d", [NSThread currentThread] == [NSThread mainThread]); 
     // do stuffs 
    } 
} 

Оба возвращают ИСТИННУЮ!

Так что мой вопрос: почему пользовательский интерфейс не обновляется? Большое спасибо!

+0

Покажите нам, как вы обновляете интерфейс, приложите полный код, пожалуйста. –

+0

Я обновил пользовательский интерфейс различными способами: меняя рамки, добавляя представления, устанавливая текст ярлыка и т. Д. Ни один из них не работает за пределами dispatch_async, но когда я помещаю их в dispatch_async, они волшебным образом работают. Пример такого кода: self.nameLabel.text = @ "foo"; – agro1986

+4

Поместите контрольную точку в методы и посмотрите, нет ли 'self.nameLabel' или любого связанного с UI объекта. –

ответ

4

Это может быть проблема nil, однако вы предоставляете слишком мало информации, чтобы знать наверняка. Причина, по которой он работает с dispatch_async и не обойтись без него, не обязательно является тем потоком, из которого вы вызываете методы, может быть, в то время, когда вы вызываете код, некоторые из ваших объектов пользовательского интерфейса равны нулю. Когда вы вызываете dispatch_async, вы добавляете задание в очередь, но поскольку все очереди отправлений являются структурами ввода-вывода первого входа, вы фактически добавляете задание в конце цикла цикла, что потенциально дает время для инициализации (где бы это ни было сделано)

+0

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

+0

Тогда это имеет смысл! –