将在单独的线程中显示UIAlertView在主线程中停止处理吗?

时间:2014-02-09 16:18:36

标签: objective-c multithreading ios7 uialertview

我有一个可以预约的iPad应用程序。如果用户碰巧重叠现有的约会,我需要通过UIAlertView让他们知道。问题当然是UIAlertView在“Save”方法完成处理之前不会显示。

我正在考虑使用一个单独的线程(称之为'B')来显示警报,并将点击的按钮传递回主线程(称之为'A')。我这样做的方法是让主线程('A')调用另一个方法,它将创建线程('B'),在新线程('B')上显示警报并返回主线程( 'A')用户点击警报上的按钮后,返回一些值,表示点击了哪个按钮。

我希望因为我将线程创建放在一个单独的方法中,所以调用方法将等待它返回,然后继续在主线程('A')中处理。

这可行吗?

更新

我刚试过这个,但是它没有用(在处理完成后主要线程继续处理后,警报显示方式 - 不是我想要的!):

    if(overlapFlag == [NSNumber numberWithInt:1])  {  //  there IS an overlap

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  //Here your non-main thread.

        NSLog (@"Hi, I'm new thread");

        UIAlertView *testView = [UIAlertView alertViewWithTitle:@"Warning!" message:@"This appointment overlaps an existing appointment.  Tap Continue to save it or Cancel to create a new appointment."];
        [testView addButtonWithTitle:@"Continue" handler:^{ NSLog(@"Yay!"); }];
        [testView addButtonWithTitle:@"Cancel" handler:^{ [self reloadAppointmentList]; }];
        [testView show];

        dispatch_async(dispatch_get_main_queue(), ^{   //Here you returns to main thread.

            NSLog (@"Hi, I'm main thread");
        });

    });

}

2 个答案:

答案 0 :(得分:2)

这是可能的。

但是在后台线程中使用UI并不是一个好习惯。为什么不在启动'Save'方法之前显示UIAlertView,并在另一个线程中调用'Save'方法?例如,这将是一个更好的解决方案:

- (void) someSaveMethod{
    [self showAlertView];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE _PRIORITY_DEFAULT, 0), ^(){
        // call you save method
        // after end save method call:
        dispatch_async(dispatch_get_main_queue(), ^{
            [self hideAllertView];
        });
     });
 }

答案 1 :(得分:1)

无需使用单独的线程。在找到重叠和其余保存过程之前,将您的保存过程分解为您可以处理的所有内容。

- (void)saveBegin
{
   // start save process
   // ...
   // now check for overlap
   if(overlapFlag == @1)  
   {  //  there IS an overlap

      NSString *message = @"alert message goes here"; 
      UIAlertView *testView = [UIAlertView alertViewWithTitle:@"Warning!" 
                                                      message:message];

      [testView addButtonWithTitle:@"Continue" 
                           handler:^{ [self saveComplete]; }];

      [testView addButtonWithTitle:@"Cancel" 
                           handler:^{ [self reloadAppointmentList]; }];
      [testView show];

    }
    else
    {
       [self saveComplete];
    }

}

- (void)saveComplete
{
    // complete save process
    // .. 
}