MST

星途 面试题库

面试题:Objective-C中NSOperationQueue的依赖关系及线程安全问题

在Objective-C项目中,多个NSOperation添加到NSOperationQueue时,如何设置操作间的依赖关系以确保执行顺序?在多线程环境下,NSOperationQueue本身是否线程安全,如果不是,应该如何处理以保证线程安全?
40.0万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

设置操作间依赖关系确保执行顺序

在Objective-C项目中,当多个NSOperation添加到NSOperationQueue时,可以通过调用addDependency:方法来设置操作间的依赖关系。例如:

NSOperation *operationA = [[NSBlockOperation alloc] init];
NSOperation *operationB = [[NSBlockOperation alloc] init];
NSOperation *operationC = [[NSBlockOperation alloc] init];

// 设置操作B依赖于操作A
[operationB addDependency:operationA];
// 设置操作C依赖于操作B
[operationC addDependency:operationB];

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:operationA];
[queue addOperation:operationB];
[queue addOperation:operationC];

这样,操作A会先执行,操作A执行完成后操作B才会执行,操作B执行完成后操作C才会执行。

NSOperationQueue线程安全性及处理

NSOperationQueue本身是线程安全的。它能够管理添加到队列中的操作,并按照指定的规则(如依赖关系、优先级等)在后台线程中执行这些操作。开发者无需额外处理NSOperationQueue本身的线程安全问题。但是,如果在多个线程中同时访问和修改NSOperationQueue的属性(如maxConcurrentOperationCount),为了避免竞争条件,可能需要使用锁(如NSLockNSRecursiveLock等)或dispatch_queue来进行同步。例如:

// 使用NSLock
NSLock *queueLock = [[NSLock alloc] init];
NSOperationQueue *sharedQueue = [[NSOperationQueue alloc] init];

// 在需要修改队列属性的地方加锁
[queueLock lock];
sharedQueue.maxConcurrentOperationCount = 3;
[queueLock unlock];

或者使用dispatch_queue

dispatch_queue_t queueQueue = dispatch_queue_create("com.example.queueQueue", DISPATCH_QUEUE_SERIAL);
NSOperationQueue *sharedQueue = [[NSOperationQueue alloc] init];

dispatch_sync(queueQueue, ^{
    sharedQueue.maxConcurrentOperationCount = 3;
});