设想:
- 用户点击一个按钮,要求对地址簿进行某种修改。
- 调用一个方法来启动此修改并显示一个警报视图。
为了显示警报视图并保持 UI 响应,我使用了 dispatch_queue:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_sync(dispatch_get_main_queue(), ^{ // Show the alert view }); });
使用以下命令启动地址簿修改过程:
dispatch_async(modifyingAddressBookQueue, ^{});
现在,我想为用户提供随时取消进程的能力(当然是在保存地址簿之前)。因此,当他点击警报表中的取消按钮时,我想访问调度块,设置一些特定的 BOOL 来停止进程并恢复通讯簿。
问题是,你不能这样做!您无法访问该块并更改其中的任何变量,因为所有变量仅复制一次。执行时块内的任何变量更改都不会被块看到。
总结一下:如何使用 UI 事件停止正在进行的操作?
更新:
该过程的代码:
- (void) startFixingModification {
_fixContacts = YES;
__block BOOL cancelled = NO;
dispatch_queue_t modifyingAddressBookQueue;
modifyingAddressBookQueue = dispatch_queue_create(sModifyingAddressBookQueueIdentifier,
NULL);
dispatch_async(modifyingAddressBookQueue, ^{
for (NSMutableDictionary *contactDictionary in _contactArray) {
if (!cancelled) {
break;
}
i = i + 1;
BOOL didFixContact = [self fixNumberInContactDictionary:contactDictionary];
if (!didFixContact) {
_fixedNumbers = _fixedNumbers - 1;
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_sync(dispatch_get_main_queue(), ^{
[self setAlertViewProgress:i];
});
});
}
});
cancelledPtr = &cancelled;
}
alertview(我自己的库)委托的代码
- (void) alertViewProgressCancel:(ASAlertViewProgress *)alertView { // This is a private lib.
if (cancelledPtr)
{
NSLog(@"stopping");
*cancelledPtr = YES;
}
}
在界面中,我声明
BOOL* cancelledPtr;
更新 2:
真的越来越令人沮丧了!对于以下代码
for (NSMutableDictionary *contactDictionary in _contactArray) {
NSLog(@"%d", _cancelModification);
if (_cancelModification) {
break;
}
}
如果 _cancelModification 设置为 YES,则 for 循环被破坏,这没关系。一旦我注释掉 NSLog 行,当它变为 YES 时,_cancelModification 就会被忽略!