我正在编写一个程序,向我的AudioSession和AudioQueues生成的不同事件显示类似于控制台的UITextView。例如,当我检测到我的音频路线发生了变化时,我只想在我的iPhone屏幕上显示一条快速消息,发生这种情况。不幸的是,我相信我遇到了一些竞争条件的肮脏,我不确定解决这个问题的最佳解决方案是什么。
当我运行程序时,我的调试控制台会将其吐出:
bool _WebTryThreadLock(bool),0x1349a0:尝试从主线程或Web线程以外的线程获取Web锁。这可能是从辅助线程调用UIKit的结果。现在崩溃......
这发生在一行代码上:
textView.text = string;
我试过了:
[textView performSelectorOnMainThread:@selector(setText:) withObject:string waitForDone:YES];
这似乎已经解决了,但我很确定我不应该做这样的事情来让它发挥作用。不幸的是,这不适用于[UITextView scrollVisibleWithRange:],因为这需要一个NSRange,它不是NSObject的后代。我认为我所做的事情根本就是错误的。
此代码是从中断侦听器调用的,该侦听器从音频队列的线程运行。是否有一些我应该做的事情会使我对textview的更新阻塞,所以我没有遇到这个问题?
感谢。
答案 0 :(得分: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。一些声明省略