面试题答案
一键面试设置操作间依赖关系确保执行顺序
在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
),为了避免竞争条件,可能需要使用锁(如NSLock
、NSRecursiveLock
等)或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;
});