当IOS中的主线程被阻塞时,UIAlertView在线程中被忽略

时间:2012-01-16 15:44:10

标签: ios nstimer uialertview nsthread nsrunloop

我有一个等待连接的应用程序。当应用程序正在等待时,我需要向用户显示AlertView,该用户应该在某个时间以编程方式或通过用户单击AlertView的取消按钮来解除。

主线程正在等待客户端连接,就像我正在创建的另一个线程一样,并显示正在更新对话框时间的AlertView。该线程有一个NSRunLoop,用于更新AlertView上的文本。

一切正常,但AlertView没有收到触摸事件,甚至没有以编程方式解散。任何人都可以对我在这里做错的事情有所了解。

以下是示例代码。

funcA() {

    [NSThread detachNewThreadSelector:@selector(createDialog) toTarget:self withObject:nil];

    [NSThread detachNewThreadSelector:@selector(updateDialog) toTarget:self withObject:nil];

    ..

    ..

    BlockingWait();

    ..

    ..

}

- (void) createDialog {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    alert = [[UIAlertView alloc] initWithTitle:@"Wait" message:@"\n" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];

    ...

    label = [[UILabel alloc] initWithFrame:CGRectMake(30.0f, 20.0f, 225.0f, 90.f)];

    [alert show];

    [alert release];

    [pool drain];

}

- (void) upDateDialog {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSRunLoop *loop = [NSRunLoop currentRunLoop];

    timer =  [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateText) userInfo:nil repeats:YES];

    [loop run];

    [pool drain];
}

- (void) updateText {

    label.text = " Wait for" + n +  "secs";

    n--;

    if ( n == 0 )
      [alert dismissWithClickedButtonIndex:0 animated:YES];  // Doesn't work
}


- (void) alertView: (UIAlertView *) alert clickedButtonAtIndex:(NSInteger) buttonIndex {
// Never Gets called
    NSLog(@"Alert is dissmissed with button index %d", buttonIndex);

    if (buttonIndex == 0) {

        [timer invalidate];
    }
}

2 个答案:

答案 0 :(得分:2)

我甚至没有阅读你的代码,只是标题已经表明你真的应该在你的架构上工作。您可以尝试破解UIKit,但它只能由UI线程管理。因此,在线程中移动阻塞调用并从主线程管理UIAlertView。

答案 1 :(得分:0)

永远不要阻止主线程。永远不会。异步地对UIAlertView进行包装,在进行其他工作时将其保存在ivar中,并根据需要进行更新。根本不需要任何线程或阻塞。只需异步使用NSURLConnection即可无阻塞地管理连接。