gpt4 book ai didi

objective-c-blocks - 如何取消 NSBlockOperation

转载 作者:行者123 更新时间:2023-12-03 06:06:50 28 4
gpt4 key购买 nike

我有一个长时间运行的循环,我想使用 NSOperation 在后台运行。我想使用一个 block :

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
while(/* not canceled*/){
//do something...
}
}];

问题是,如何检查它是否被取消。该 block 不接受任何参数,并且在被 block 捕获时,operation 为 nil。有没有办法取消区 block 操作?

最佳答案

呵呵。亲爱的 future 谷歌员工:当然,当被 block 复制时,操作为零,但它不必被复制。它可以用 __block 进行限定,如下所示:

//THIS MIGHT LEAK! See the update below.
__block NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
while( ! [operation isCancelled]){
//do something...
}
}];

更新:

经过进一步思考,我发现这将在 ARC 下创建一个保留周期。在 ARC 中,我相信 __block 存储被保留。如果是这样,我们就有麻烦了,因为 NSBlockOperation 还保留了对传入 block 的强引用,该 block 现在具有对操作的强引用,操作又对传入 block 具有强引用,其中...

这有点不太优雅,但使用显式弱引用应该会打破循环:

NSBlockOperation *operation = [[NSBlockOperation alloc] init];
__weak NSBlockOperation *weakOperation = operation;
[operation addExecutionBlock:^{
while( ! [weakOperation isCancelled]){
//do something...
}
}];

任何人有更优雅的解决方案的想法,请发表评论!

关于objective-c-blocks - 如何取消 NSBlockOperation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8113268/

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