我有一个可以预约的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");
});
});
}
答案 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
// ..
}