gpt4 book ai didi

ios - GCD 串行队列和竞争条件

转载 作者:行者123 更新时间:2023-12-01 18:49:59 31 4
gpt4 key购买 nike

我有两种在串行队列上运行的方法。每个方法都返回某个类的副本。我试图在保持数据完整性的同时实现线程安全解决方案。

例如:

-(Users *) getAllUsers
{
__block copiedUsers;
dispatch_sync(_backgroundQueue, ^{
copiedUsers = [self.users copy]; // return copy object to calling thread.
});
return copiedUsers;
}

-(Orders *) getAllOrders
{
__block copiedOrders;
dispatch_sync(_backgroundQueue, ^{
copiedOrders = [self.Orders copy]; // return copy object to calling thread.
});
return copiedOrders;
}

除了这两种方法之外,我还有一个添加/删除用户和订单的工作类,所有这些都通过串行队列 backgroundQueue 完成。 .

如果在主线程中我调用 getAllUsers然后 getAllOrders紧接着另一个我的数据完整性是不安全的,因为在两次调用之间, worker 类(Class)可能已经改变了模型。

我的问题是如何为调用者提供一个允许多个方法以原子方式运行的良好接口(interface)?

最佳答案

模型仅从 backgroundQueue 更新串行队列。
客户端通过接收在后台队列中运行的 block 的方法与模型对话。

此外,为了不卡住主线程,我创建了另一个队列并运行了一个与网关方法对话的 block 。

P.S - 注意 dispatch_sync仅在 runBlockAndGetNeededDataSafely 中调用以避免死锁。

代码示例:

View Controller .m

ManagerClass *m = [ManagerClass new];    
dispatch_queue_t q = dispatch_queue_create("funnelQueue", DISPATCH_QUEUE_SERIAL);
dispatch_block_t block_q = ^{
__Users *users;
__Orders *orders;
[manager runBlockAndGetNeededDataSafely:^
{
users = [manager getUsers];
orders = [manager getOrders];
dispatch_async(dispatch_get_main_queue(),
^{
// got data safely - no thread issues, copied objects. update UI!
[self refreshViewWithUsers:users
orders:orders];
});
}];
}
dispatch_async(q, block_q);

Manager.m 实现:
-(void) runBlockInBackground:(dispatch_block_t) block
{
dispatch_sync(self.backgroundQueue, block);
}
-(Users *) getAllUsers
{
return [self.users copy];
}

-(Orders *) getAllOrders
{
return [self.Orders copy];
}

关于ios - GCD 串行队列和竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31848130/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com