主线程中调用AVAssetImageGenerator完成处理程序?

贾拉尼
  1. 我正在尝试从视频中获取一系列图像。它运行良好,但我怀疑完成处理程序在哪个线程中调用。

  2. generateCGImagesAsynchronouslyForTimes:在新操作中调用了此method(),并在完成处理程序中更新了UI。用户界面得到更新。

  3. 但是通常UI更新是否不会在辅助线程中发生?我的疑问是在当前调用线程或主线程中调用完成处理程序吗?

我的代码是:

__block unsigned int i = 0;
AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){

    i++;
    if(result == AVAssetImageGeneratorSucceeded){

        //Create a block to save the image in disk
        NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
            NSFileManager *fileMgr = [NSFileManager defaultManager];
            NSString *documentsDirectory = [NSHomeDirectory()
                                            stringByAppendingPathComponent:@"Documents"];
            NSError *error = nil;

            //Create file path for storing the image
            NSString *videoOutputPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"VideoFrames%i.png", i]];

            //Delete if already any image exist 
            if ([fileMgr fileExistsAtPath:videoOutputPath]){
                if ([fileMgr removeItemAtPath:videoOutputPath error:&error] != YES)
                    NSLog(@"Unable to delete file: %@", [error localizedDescription]);
            }

            //Convert the CGImageRef to UIImage
            UIImage *image = [UIImage imageWithCGImage:im];//**This line gives error: EXE_BAD_ACCESS**

            //Save the image
            if(![UIImagePNGRepresentation(image) writeToFile:videoOutputPath options:NSDataWritingFileProtectionNone error:&error])
                NSLog(@"Failed to save image at path %@", videoOutputPath);
        }];

        //Add the operation to the queue
        [self.imageWritingQueue addOperation:operation];
    }
   }
};
温恩

IIRC,是的。但是您可以对其进行测试,并且为了安全起见,可以将代码包装在将其分派到主线程的代码块中。

一般而言,回调必须返回主线程,因为如果不是主线程,则不能保证其启动的线程正在运行运行循环。

除非您正在调度要与其他操作(依赖项)相关联的创建块,否则我不确定该块为您提供了什么优势,因为图像加载是异步的,因此您可以从主线程触发它而不会阻塞任何东西。


根据您的评论,在这种情况下,您应该切换代码。在完成块内创建块操作,该块操作为您提供图像。将每个块操作添加到您的队列中。块操作仅获取图像并将其保存到磁盘。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在主线程上运行NSURLSession完成处理程序

如何处理此“ InvalidOperationException:确保只能从主线程调用确保运行中主线程”

Eclipse后台作业:在主线程中处理特定的调用吗?

事件处理程序似乎总是在主线程等待循环之后完成

IBAction方法中调用的完成处理程序

如何异步等待网络请求完成,而在主线程中处理结果?

如何使主线程等待执行程序服务线程完成

为什么我们在异步函数中在主线程上调用完成?

如何停止主线程以完成所有 Mono 调用?

在主线程中调用TThread.Synchronize

在该线程并CompletableFuture的完成处理程序中执行呢?

为什么只有主线程才能在Python中设置信号处理程序

在哪些情况下可以在非主线程中执行信号处理程序?

什么时候在主线程中创建了默认的Looper和处理程序

完成处理程序中的完成处理程序?

完成处理程序未调用

完成处理程序从未调用

在Objective-C中实现后台任务完成后调用完成处理程序的方法时,如何确定线程安全性?

在Android中从辅助线程调用主线程

多次调用扫描程序时引发异常。“线程主线程中的异常” java.util.NoSuchElementException:找不到行

从完成处理程序中调用返回父函数

在目标C中调用Swift完成处理程序

使用完成处理程序在Swift中调用连续动画

强制在主线程中完成所有UIKit的工作

您不应从应用程序主线程调用getWriteableDatabase()

如何让主线程最后完成

从线程/ GCD /完成处理程序返回

在Kotlin中,处理程序线程会等待另一个线程完成吗?

在NodeJS中,事件处理程序中的`fs.writeFile()`是否会在某个时间点阻塞主线程?