我需要在后台以不同的线程优先级同时执行两个任务:

  • 连续收集并处理陀螺仪运动数据(高优先级)
    gyroQueue = [[NSOperationQueue alloc] init];
    
    [self.motionManager startDeviceMotionUpdatesToQueue:gyroQueue withHandler:^(CMDeviceMotion *motion, NSError *error){
        [self processMotion:motion withError:error];
    }];
    
  • 有时在不干扰运动更新的情况下处理图像(转换,裁剪,缩放等= 1-2秒)(非常低的优先级)
    imageProcessingQueue = [[NSOperationQueue alloc] init];
    
    [imageProcessingQueue addOperationWithBlock:^{
        [self processImage:[UIImage imageWithData:imageData]];
    }];
    

  • 编辑:这是我本来就位的(而不是阻止操作),它仍然阻止了运动更新:
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(processImage:) object:[UIImage imageWithData:imageData]];
    [operation setThreadPriority:0.0];
    [operation setQueuePriority:0.0];
    [imageProcessingQueue addOperation:operation];
    

    似乎这两个任务都在同一个后台线程上执行(由于NSOperationQueue本质?),并且图像处理会阻止gyroQueue更新,直到完成为止,这就是我要避免的事情。

    如何使用NSOperationQueue产生两个单独的线程,并相应地分配veryHigh和veryLow优先级?

    编辑:这个问题仍然是开放的,我正在使用Travor Harmon的图像调整大小功能进行图像调整大小。有人可以确认它是否线程安全吗?

    最佳答案

    我认为在这里您可以尝试仅创建一个操作队列,然后尝试根据需要设置每个操作的优先级。如果仅使用一个队列,线程优先级将更有效,并使您以更简洁的方式思考(毕竟,这只是建议)。

    - (void)setThreadPriority:(double)priority
    

    您指定的值将映射到操作系统的优先级值。指定的线程优先级仅在执行操作的main方法时才应用于线程。在执行操作的完成块时不应用它。对于在其中创建自己的线程的并发操作,必须在自定义启动方法中自行设置线程优先级,并在操作完成后重置原始优先级。

    来自苹果公司的文件。
    Operation queues usually provide the threads used to run their operations. In Mac OS X v10.6 and later, operation queues use the libdispatch library (also known as Grand Central Dispatch) to initiate the execution of their operations. As a result, operations are always executed on a separate thread, regardless of whether they are designated as concurrent or non-concurrent operations. In iOS 4 and later, operation queues use Grand Central Dispatch to execute operations.

    10-08 05:48