Полная загадка - методы iOS выполняются после случайной задержки - PullRequest
0 голосов
/ 20 января 2012

У меня есть вариант следующих кодов, запускаемых пользовательским вводом.

NSLog(@"WHY YOU iOS!!!");
[scanButton setSelected:YES];
[overlayImageView setImage:image];
[overlayView setHidden:YES];

Дело в том, что вышеприведенная процедура выполняется с кажущейся случайной задержкой от пяти секунд до более минуты.

Иногда они вообще не выполняются, за исключением таинственного метода NSLog. Если я устанавливаю точку останова в строке NSLog, она просто выполняется немедленно, и я вижу «ПОЧЕМУ ВЫ... "распечатано в консоли.Тем не менее, даже несмотря на то, что отладчик плавно проходит три строки ниже, без ошибок и предупреждений, эффект следующих трех строк возникает после случайной задержки или бесконечной задержки.В чем дело?Как могло случиться так, что они имеют случайную задержку?

Я подозревал, что часть пользовательского интерфейса Cocoa SDK приостанавливается из-за плохого дизайна моей программы или чего-то еще, но даже во время случайной задержки другие кнопки и функции работают так хорошов то время как эффект setImage происходит внезапно через 47,2 секунды.Что не так с iOS или со мной?

Что меня смущает еще больше, так это то, что описанная выше точная процедура работает без задержек, если параметр изображения (UIImage *) поступает из другого источника.Если это так, мы можем приписать причину проблемы изображению, однако, почему scanButton и overlayView также отвечают с одинаковой задержкой, даже если они не имеют никакого отношения к изображению?Полная загадка для меня.

1 Ответ

3 голосов
/ 20 января 2012

Понятия не имею, что происходит, поскольку в коде, который вы предоставили, практически нет подсказок, но почему вы не пытаетесь что-то вроде этого:

dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"WHY YOU iOS!!!");
        [scanButton setSelected:YES];
        [overlayImageView setImage:image];
        [overlayView setHidden:YES];

        [overlayImageView setNeedsDisplay];
        [overlayImageView setNeedsLayout];

        [scanButton setNeedsDisplay];
        [scanButton setNeedsLayout];

        [overlayView setNeedsDisplay];
        [overlayView setNeedsLayout];

});

Как правило, всегда обновляйте пользовательский интерфейс в основном потоке (в случае, если вы используете фоновый поток) и устанавливайте элементы управления пользовательским интерфейсом по мере необходимости для перерисовки.

...