gpt4 book ai didi

ios - 在 UIAlertView 关闭后执行任务

转载 作者:行者123 更新时间:2023-11-28 21:56:16 26 4
gpt4 key购买 nike

我有一个 UIlertView 来询问用户他/她是否想在对数据执行某些操作之前备份数据。如果用户点击是,我做了这样的事情来捕获:

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
if (buttonIndex != alertView.cancelButtonIndex)
[self backupData];

[self doSomethingWithData];
}

但是当用户关闭 UIAlertView 时,UI 将卡住,直到 backupDatadoSomethingWithData 方法完成。我认为在后台执行这些方法是 Not Acceptable ,因为 doSomethingWithData 必须在 backupData 完成时启动。我怎样才能完全关闭 UIAlertView,然后启动 backupDatadoSomethingWithData 方法?

最佳答案

所以,解决方案很简单:

不想卡住用户界面 ---> 使用后台调度程序执行;

想在备份后执行一些事情 ---> 传递一个 block 以完成。

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex != alertView.cancelButtonIndex){
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
{
__weak typeof (self) weakSelf = self;
[self backupDataWithCompletion:^(NSData *data) {
[weakSelf doSomethingWithData:data];
}];
});

}
}

- (void)backupDataWithCompletion:(void (^)(NSData *))completionBlock
{
NSData *data = //Do something

completionBlock(data);
}

或者另一种解决方案(不太优雅)是将任务插入到主线程上不起作用的串行队列中:

所以在你的 init 方法中初始化这个队列:

_queue = dispatch_queue_create("backupQueue", DISPATCH_QUEUE_SERIAL);

queue 是一个属性或 var dispatch_queue_t queue;然后:

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex != alertView.cancelButtonIndex){

dispatch_async(queue, ^
{
[self backupData];
});

dispatch_async(queue, ^
{
[self doSomethingWithData];
});

}
}

关于ios - 在 UIAlertView 关闭后执行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26434579/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com