Проблемы с обновлением GUI - PullRequest
       13

Проблемы с обновлением GUI

1 голос
/ 06 октября 2009

Я пишу программу, которая отображает в UITextView, похожем на консоль, различные события, генерируемые моей AudioSession и AudioQueues. Например, когда я обнаруживаю, что мой аудио маршрут изменился, я просто хочу, чтобы на экране моего iPhone отобразилось быстрое сообщение о том, что это произошло. К сожалению, я полагаю, что попадаю в состояние гонок, и я не уверен, что это лучшее решение.

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

bool _WebTryThreadLock (bool), 0x1349a0: попытался получить веб-блокировку из потока, отличного от основного или веб-потока. Это может быть результатом обращения к UIKit из вторичного потока. Грохнуть сейчас ...

Это происходит в строке кода:

textView.text = string;

Я пробовал это:

[textView performSelectorOnMainThread:@selector(setText:) withObject:string waitForDone:YES];

И это, казалось, исправило это, но я почти уверен, что я не должен делать что-то подобное, чтобы заставить это работать. К сожалению, это не работает с [UITextView scrollVisibleWithRange:], поскольку для этого требуется NSRange, который не является потомком NSObject. Я думаю, что то, что я делаю, в корне неправильно.

Этот код вызывается из прослушивателя прерываний, который запускается из потока аудио-очереди. Есть ли что-то, что я должен сделать, чтобы мои обновления текстового поля блокировались, поэтому у меня нет этой проблемы?

Спасибо.

1 Ответ

2 голосов
/ 07 октября 2009
  1. Вам разрешено делать что-либо с представлением только из основного потока , вы все сделали правильно.
  2. Если требуется больше параметров или примитива, вам может понадобиться прокси-функция.

Вот так я делаю функцию прокси

// the caller should be like this
UTMainThreadOperationTextViewScroll *opr = [[UTMainThreadOperationTextViewScroll alloc] init];
opr.textView = textView;
opr.range = NSMakeRange(5, 10);
[UTMainThread performOperationInMainThread:opr];
[opr release];

// the Utility classes goes below
@interface UTMainThreadOperation : NSObject
- (void)executeOperation;
@end

@implementation UTMainThread

+ (void)performOperationInMainThread:(UTMainThreadOperation *)operaion
{
    [operaion performSelectorOnMainThread:@selector(executeOperation) withObject:nil waitUntilDone:NO];
}

@end

@implementation UTMainThreadOperationTextViewScroll

@synthesize textView;
@synthesize range;

- (void)dealloc { /* I'm too lazy to post it here */ }

- (void)executeOperation
{
    [textView scrollVisibleWithRange:range];
}

@end

PS. некоторые объявления опущены

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