【问题标题】:Displaying UI elements such as alerts from multiple threads显示 UI 元素,例如来自多个线程的警报
【发布时间】:2011-04-27 07:04:40
【问题描述】:

我有一个简单的应用程序,它运行良好,直到我添加了一些代码,它在某个时候启动一个新线程,然后尝试显示来自该线程的警报。现在,只要点击显示警报的代码,应用就会崩溃。

UIAlertView * addAlert = [[UIAlertView alloc] initWithTitle:@"New alert"
message:@"Example alert" 
delegate:nil 
cancelButtonTitle:@"Cancel", otherButtonTitles:@"OK", nil];
[addAlert show];
[addAlert release];

我的问题是:是否可以在 iOS 上显示 UI 元素,例如来自多个线程的警报?

【问题讨论】:

    标签: ios uialertview ios-4.2


    【解决方案1】:

    您绝对不希望从主线程以外的任何线程显示警报(或任何与 UI 相关的内容)。我建议将您的警报代码放在一个函数中并调用其中一个 performSelectorOnMainThread 调用。

    - (void) showAlert
    {
        UIAlertView * addAlert = [[UIAlertView alloc] initWithTitle:@"New alert"
            message:@"Example alert" 
            delegate:nil 
            cancelButtonTitle:@"Cancel", otherButtonTitles:@"OK", nil];
        [addAlert show];
        [addAlert release];
    }
    
    // ... somewhere in the worker thread ...
    [self performSelectorOnMainThread:@selector(showAlert) withObject:nil waitUntilDone:NO];
    

    【讨论】:

      【解决方案2】:

      我很确定主线程是唯一应该处理 UI 识别/将内容绘制到屏幕的线程。如果我处于你的位置,我会做的是使用 KVO 通知或实现某个类订阅的协议。走协议路线,当您到达代码的警报部分时,仅让该线程调用其协议方法,订阅类将通过触发委托函数而得到警报,您可以通过主线程。

      希望对您有所帮助。

      【讨论】:

        【解决方案3】:

        更好更简单的方法是使用 alertView 调用 performSelectorOnMainThread 方法。 在你的情况下试试这条线

        [addAlert performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];
        

        而不是

        [addAlert show];
        

        它会在主线程调用Alertview的show方法。无需编写任何额外的方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多