这是我的代码:
for (NSString *framePath in self.inputFramePaths) {
if ([weakOperation isCancelled]){
break;
}
self.currentFrame = [UIImage imageWithContentsOfFile:framePath];
CGImageDestinationAddImage(destination, self.currentFrame.CGImage, (__bridge CFDictionaryRef)frameProperties);
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if ([self.delegate respondsToSelector:@selector(didFinishWritingOneFrameWithSender:)]){
[self.delegate didFinishWritingOneFrameWithSender:self];
}
}];
self.currentFrameIndex++;
}
我正在将图像帧写入文件,并且在写入每个帧时,我想通知 UI 更新进度条并显示刚刚写入的图像。问题是工作队列比 ui 主队列快得多。结果是ui队列延迟接收更新。self.currentFrameIndex 每次在工作队列中递增 1,在 ui 队列中延迟如下:
工作队列:0、1、2、3、4、5、6、7、8、9
UI主队列:0、2、4、5、6、7、9、9、9、9
如果我有更大的帧数,延迟会被放大。我想有办法确保工作队列等待 UI 队列,并保证执行顺序。但由于我更关心处理速度,我只想看看处理的进度。有没有办法跳过后期事件并跟上处理?如果我打印 currentFrameIndex,我想要这样的东西:
工作队列:0、1、2、3、4、5、6、7、8、9
UI主队列:0、2、4、5、6、7、9
延迟事件被取消的地方。我想我可以做一些特别的实验并跳过每个 x 更新,但是 NSOperationQueue 框架中是否有这种机制?我试着把
[[NSOperationQueue mainQueue] cancelAllOperations];
最后在循环之外,没有帮助......
编辑:
基于 Amin 的回答的一个非常简单的解决方案:
if (!self.isUiOperationHandled){
self.uiOperationHandled = YES;
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if ([self.delegate respondsToSelector:@selector(didFinishWritingOneFrameWithSender:)]){
[self.delegate didFinishWritingOneFrameWithSender:self];
}
self.uiOperationHandled = NO;
}];
}