我需要在后台以不同的线程优先级同时执行两个任务:
gyroQueue = [[NSOperationQueue alloc] init];
[self.motionManager startDeviceMotionUpdatesToQueue:gyroQueue withHandler:^(CMDeviceMotion *motion, NSError *error){
[self processMotion:motion withError:error];
}];
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.