GUI更新同步问题

时间:2009-10-06 06:20:14

标签: objective-c iphone

我正在编写一个程序,向我的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的更新阻塞,所以我没有遇到这个问题?

感谢。

1 个答案:

答案 0 :(得分:2)

  1. 您可以对视图仅从主线程执行任何操作,您做对了。
  2. 如果需要更多参数或原语,则可能需要代理功能。
  3. 这就是我制作代理功能的方式

    // 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。一些声明省略