【发布时间】:2017-09-20 11:14:25
【问题描述】:
我有一个预构建的 C 库(二进制文件和头文件),其中包含一个重功能。此功能可能需要几分钟或更长时间才能完成。通常我使用 GCD 在后台移动计算并保持 UI 线程空闲:
// show activity indicator or something else
dispatch_queue_t queue = dispatch_queue_create(NULL, NULL);
dispatch_async(queue, ^{
void *resultData = callOfHeavyLibraryMethodHere(params);
dispatch_async(dispatch_get_main_queue(), ^{
// show resultData to user
});
});
但是如果用户想取消这个操作呢?据我所知,我无法停止 GCD 的运行块。我读到了NSThread - 但它也无法从另一个线程(主线程)中杀死一个线程(通过计算)。还有其他解决方案吗?
我不能使用这个答案How to cancel/exit/stop execution of Thread object or thread running in background in IOS 的解决方案,因为即使我调用cancel 方法我也没有地方检查isCancelled 变量。
这不是我的情况:
NSOperationQueue* myQueue = [[NSOperationQueue alloc] init];
NSBlockOperation* myOp = [[NSBlockOperation alloc] init];
[myOp addExecutionBlock:^{
for (int i = 0; i < 1000000; i++)
{
if ([myOp isCancelled]) // <-- check and interrupt operation
return;
doSmallPartOfWorkForItemAtIndex(i);
}
}];
[myQueue addOperation:myOp];
这是我的情况:
NSOperationQueue* myQueue = [[NSOperationQueue alloc] init];
NSBlockOperation* myOp = [[NSBlockOperation alloc] init];
[myOp addExecutionBlock:^{
void *resultData = callOfHeavyLibraryMethodHere(params);
// pass data somewhere else
}];
[myQueue addOperation:myOp];
没有办法检查isCancelled,操作不会以这种方式中断。我也不能调用[NSThread exit],因为我的代码中没有中间点。
【问题讨论】:
标签: ios asynchronous grand-central-dispatch nsthread cancellation