iOS 的多读单写指的是多个线程可以同时读取共享的数据,但是只有一个线程能够写入数据。这是为了保证数据的一致性和避免竞争条件的出现。
一 在 Objective-C 中,可以使用 GCD 的并发队列来实现多读单写。具体实现步骤如下:
1.定义一个并发队列和一个串行队列,用于处理读操作和写操作,分别为 readQueue 和 writeQueue。
dispatch_queue_t readQueue = dispatch_queue_create("com.example.readQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t writeQueue = dispatch_queue_create("com.example.writeQueue", DISPATCH_QUEUE_SERIAL);
2.定义一个全局变量,用于存储共享数据。
NSMutableArray *sharedData = [NSMutableArray array];
3.实现读操作,使用 readQueue 中的异步方法来执行读取操作,这样多个读操作可以同时进行。
- (void)readDataWithCompletion:(void (^)(NSArray *))completion {
dispatch_async(readQueue, ^{
NSArray *dataArray = [NSArray arrayWithArray:sharedData];
dispatch_async(dispatch_get_main_queue(), ^{
completion(dataArray);
});
});
}
4.实现写操作,使用 writeQueue 中的同步方法来执行写入操作,这样保证只有一个线程能够写入数据
- (void)writeData:(id)data {
dispatch_sync(writeQueue, ^{
[sharedData addObject:data];
});
}
通过以上步骤,我们实现了多读单写的功能,多个线程可以同时读取共享数据,但是只有一个线程能够写入数据。这样可以保证数据的一致性和避免竞争条件的出现。注意在 Objective-C 中需要使用 block 来传递回调函数,以及使用 dispatch_get_main_queue() 来将结果回调到主线程。
二 使用 dispatch_barrier_async 函数 并发队列
dispatch_queue_t queue = dispatch_queue_create("com.example.queue", DISPATCH_QUEUE_CONCURRENT);
NSMutableArray *array = [NSMutableArray array];
- (void)write:(id)value {
dispatch_barrier_async(queue, ^{
[array addObject:value];
});
}
- (NSArray *)read {
__block NSArray *result = nil;
dispatch_sync(queue, ^{
result = [array copy];
});
return result;
}
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/lvlemo/article/details/130069488