0

这是我的代码:

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;
            }];
        }            
4

1 回答 1

1

好吧,排队的意思是,他们在排队。;-)

当计数器改变时,只需设置一个标志。如果未设置标志且为计数器的实际值,则仅发送更新通知。清除委托结束时的标志。

也许您想在循环完成后发送额外的消息。

于 2013-07-26T21:25:28.490 回答