iOS开发:深入理解dispatch_barrier_(a)sync

需积分: 0 0 下载量 175 浏览量 更新于2024-08-05 收藏 155KB PDF 举报
"iOS开发中的线程同步技术,特别是dispatch_barrier_(a)sync函数的使用" 在iOS开发中,线程同步是确保多线程环境下数据一致性与安全的关键技术。`dispatch_barrier_(a)sync`是GCD (Grand Central Dispatch) 提供的一种特殊的同步机制,用于处理对共享数据的并发访问。这两个函数主要应用于并发队列,帮助开发者构建一种屏障,以确保特定任务在其他所有任务执行完毕后再执行。 共同点: 1. **等待前置任务完成**:无论是`dispatch_barrier_sync`还是`dispatch_barrier_async`,都会确保在当前任务插入队列之前的所有任务执行完毕。 2. **等待自身任务执行**:两个函数都会等待它们自己的任务执行完成后再允许执行队列中的后续任务。 不同点: 1. **dispatch_barrier_sync**:此函数会阻塞当前线程,直到其插入的屏障任务执行完毕。这意味着,当前线程会等待屏障任务执行完成,然后才会继续执行队列中在其之后的任务。 2. **dispatch_barrier_async**:与`dispatch_barrier_sync`不同,这个函数是非阻塞的。它会立即返回,不会等待屏障任务执行完成,而是继续将后续任务插入队列。只有当屏障任务执行完毕后,这些后续任务才会开始执行。 以代码示例来解释: ```swift // 创建并发队列 let concurrentQueue = DispatchQueue(label: "concurrentQueue", attributes: .concurrent) // 向队列中添加任务 concurrentQueue.async { print("任务1, \(Thread.current)") } concurrentQueue.async { print("任务2, \(Thread.current)") } concurrentQueue.async { print("任务3, \(Thread.current)") } // 添加屏障任务 concurrentQueue.barrier.async { Thread.sleep(forTimeInterval: 1) // 模拟耗时操作 print("屏障任务, \(Thread.current)") } // 添加屏障任务后的任务 concurrentQueue.async { print("任务4, \(Thread.current)") } concurrentQueue.async { print("任务5, \(Thread.current)") } ``` 在这个例子中,任务1、2、3会并行执行,然后是屏障任务,最后是任务4和5。屏障任务会确保在所有前置任务完成后开始,并且在它完成后再执行任何后续任务。`dispatch_barrier_sync`会在当前线程上等待屏障任务完成,而`dispatch_barrier_async`则不会阻塞当前线程,它会立即返回。 `dispatch_barrier_(a)sync`为开发者提供了一种强大的工具,用于控制并发队列中的任务执行顺序,尤其是在需要确保特定操作顺序或者对共享数据进行更新时。合理使用这两个函数可以避免数据竞争问题,提高应用程序的稳定性和性能。

def write(self, vals): audit = self.env['approval.flow'].search([('approval_cannot_run_id', '=', '修改')]) value_list = list(vals.keys()) receive_list = [] value_list_not_in_receive_list = [i for i in value_list if i not in receive_list] value_list = value_list_not_in_receive_list # 应付 dispatch_number = 0 dispatch_id = self.env['roke.dispatch.order.management.price.approve'].search([('order_id.id', '=', self.id)]) dispatch_list = ['value03', 'value04', 'value05', 'value06', 'value07', 'value08'] if dispatch_id: for rec in value_list: for dispatch_list_id in dispatch_list: if rec == dispatch_list_id: if dispatch_id.approval_status != '未提' and dispatch_id.approval_status != '驳回': raise UserError("应付费用已开始审核不允许修改") value_list_not_in_dispatch_list = [i for i in value_list if i not in dispatch_list] value_list = value_list_not_in_dispatch_list dispatch_number = 1 break if dispatch_number: break # 基础 base_number = 0 base_list = ['client', 'department_manager', 'box_number', 'shipping_companies', 'field_station', 'ship_name_voyage', 'port_of_discharge', 'box_type', 'code', 'bill__of_lading_number', 'departure_date', 'lead_sealing', 'booking_time', 'date_of_pick_up', 'encore_date', 'set_port_date', 'estimated_range', 'destination_port_arrival_time'] if value_list: for rec in value_list: for base_list_id in base_list: if rec == base_list_id: if dispatch_id: if dispatch_id.approval_status != '未提' and dispatch_id.approval_status != '驳回': raise UserError("应付费用已开始审核不允许修改") base_number = 1 break if base_number: break return super(Rokedispatchordermanagement, self).write(vals) audit审核完成如果是修改不能修改如果不是可以修改怎么写可以实现

2023-06-13 上传