iOS 用多线程控制程序执行顺序

该博客介绍了如何在iOS应用中利用GCD的串行队列和信号量来确保网络请求按顺序进行,并在每个请求完成后再按顺序添加视图。具体做法是在一个串行队列中,通过信号量控制并发,确保每次只有一个网络请求或视图添加操作执行,从而实现数据加载和UI更新的有序性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、按顺序多次从一个接口请求数据

//按顺序请求语数英三门学科的数据;
- (void)getAllSubjectHomeworkData {
    if (self.subjectCountData.list.count == 0) {
        return;
    }
    dispatch_queue_t queueUploadBegin = dispatch_queue_create("com.getAllSubjectHomeworkData.subsystem.tast", DISPATCH_QUEUE_SERIAL);
    dispatch_semaphore_t semaphoreBegin = dispatch_semaphore_create(1); //设置信号总量为1,保证只有一个进程执行;
    for (NSInteger i = 0; i < self.subjectCountData.list.count; i ++) {
        SSTSubjectCountModel *subModel = self.subjectCountData.list[i];
        [subModel.homeworkListModel.list removeAllObjects]; //先清空数据;
        NSInteger pageNO = 1;
        NSInteger pageSize = subModel.workCount;
        NSString *subjectName = subModel.subject;
        if (pageSize > 0) {
            dispatch_async(queueUploadBegin, ^{
                dispatch_semaphore_wait(semaphoreBegin, DISPATCH_TIME_FOREVER); //等待信号量
                NSString *classId = [[NSUserDefaults standardUserDefaults] objectForKey:kCorrectClassId];
                NSDictionary *params = @{@"pageNo":@(pageNO),@"pageSize":@(pageSize),@"type":@"0",@"subject":subjectName.length>0?subjectName:@"", @"classId":classId.length?classId:@""};
                WEAKSELF(weakSelf);
                NSLog(@" --- 正在请求%@科目的数据 --- ",subjectName);
                [XWHttpClient xw_postWithUrlString:AppendURL(kHomeworkList) Params:params DefaultHUD:NO SuccessBlock:^(id returnValue) {
                    SSTCorrectHomeworkListModel *tempModel = [SSTCorrectHomeworkListModel mj_objectWithKeyValues:DicGetValue(returnValue, @"data")];
                    subModel.homeworkListModel = tempModel;
                    dispatch_semaphore_signal(semaphoreBegin);
                    if (i == weakSelf.subjectCountData.list.count - 1) {
                        dispatch_async(dispatch_get_main_queue(), ^{
                            NSLog(@" --- 全部学科的数据请求完毕 --- ");
                        });
                    }
                } ErrorBlock:^(id errorCode) {
                    dispatch_semaphore_signal(semaphoreBegin);
                } FailureBlock:^(id failureInfo) {
                    dispatch_semaphore_signal(semaphoreBegin);
                }];
            });
        }
    }
}

二、按顺序添加多个View

- (void)createLocationViews {
    dispatch_queue_t queueUploadBegin = dispatch_queue_create("com.createLocationViews.subsystem.tast", DISPATCH_QUEUE_SERIAL);
    dispatch_semaphore_t semaphoreBegin = dispatch_semaphore_create(1); //设置信号总量为1,保证只有一个进程执行;
    __block ViewController *weakSelf = self;
    for (NSInteger i = 0; i < self.loacationArr.count; i ++) {
        LocationModel *subModel = self.loacationArr[i];
        dispatch_async(queueUploadBegin, ^{
            dispatch_semaphore_wait(semaphoreBegin, DISPATCH_TIME_FOREVER); //等待信号量;
            dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5*NSEC_PER_SEC));
            dispatch_after(delayTime, dispatch_get_main_queue(), ^{
                NSLog(@" --- 添加 locationView 第 %ld 个 --- ", i);
                UIView *locationView = [[UIView alloc] initWithFrame:CGRectMake(subModel.location_X, subModel.location_Y, 30, 30)];
                locationView.backgroundColor = [weakSelf randomColor];
                locationView.layer.cornerRadius = 15;
                locationView.layer.masksToBounds = YES;
                locationView.alpha = 0.0;
                [weakSelf.view addSubview:locationView];
                [UIView animateWithDuration:0.5 animations:^{
                    locationView.alpha = 1.0;
                    dispatch_semaphore_signal(semaphoreBegin);
                    if (i == weakSelf.loacationArr.count - 1) {
                        NSLog(@" --- locationView 添加完毕 --- ");
                    }
                }];
            });
            
        });
    }
}

参考文章

iOS多个网络请求完成后执行下一步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值