You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS 16+Xcode14下OSAtomicIncrement32Barrier废弃问题解决方案咨询

解决Parse Server集成中OSAtomic相关API的废弃警告问题

在Xcode14、iOS16环境下集成Parse Server,安装Parse pod后运行代码时出现以下废弃警告:

'OSAtomicIncrement32Barrier' is deprecated: first deprecated in iOS 10.0 - Use atomic_fetch_add() from <stdatomic.h> instead

问题出现在taskForCompletionOfAllTasks:方法中的两处原子操作API调用,下面是具体解决步骤:

步骤1:引入标准原子操作头文件

在包含该方法的类实现文件顶部,导入<stdatomic.h>头文件:

#import <stdatomic.h>

步骤2:替换废弃的原子操作API

注意:OSAtomic系列API和stdatomic的API返回值逻辑不同,需对应调整判断条件:

  • OSAtomicIncrement32Barrier(&var) 返回自增后的值,而atomic_fetch_add(&var, 1) 返回自增前的值(此处仅需自增操作,无需返回值,直接替换即可)
  • OSAtomicDecrement32Barrier(&var) 返回自减后的值,而atomic_fetch_sub(&var, 1) 返回自减前的值,因此判断条件需从“减后为0”改为“减前为1”

修改后的代码如下:

+ (instancetype)taskForCompletionOfAllTasks:(nullable NSArray<BFTask *> *)tasks {
    __block int32_t total = (int32_t)tasks.count;
    if (total == 0) {
        return [self taskWithResult:nil];
    }

    __block int32_t cancelled = 0;
    NSObject *lock = [[NSObject alloc] init];
    NSMutableArray *errors = [NSMutableArray array];

    BFTaskCompletionSource *tcs = [BFTaskCompletionSource taskCompletionSource];
    for (BFTask *task in tasks) {
        [task continueWithBlock:^id(BFTask *t) {
            if (t.error) {
                @synchronized (lock) {
                    [errors addObject:t.error];
                }
            } else if (t.cancelled) {
                // 替换废弃的OSAtomicIncrement32Barrier
                atomic_fetch_add(&cancelled, 1);
            }

            // 替换废弃的OSAtomicDecrement32Barrier,同时调整判断条件
            if (atomic_fetch_sub(&total, 1) == 1) {
                if (errors.count > 0) {
                    if (errors.count == 1) {
                        tcs.error = [errors firstObject];
                    } else {
                        NSError *error = [NSError errorWithDomain:BFTaskErrorDomain
                                                             code:kBFMultipleErrorsError
                                                         userInfo:@{ BFTaskMultipleErrorsUserInfoKey: errors }];
                        tcs.error = error;
                    }
                } else if (cancelled > 0) {
                    [tcs cancel];
                } else {
                    tcs.result = nil;
                }
            }
            return nil;
        }];
    }
    return tcs.task;
}

验证说明

修改后重新编译代码,废弃警告会消失,同时原子操作的线程安全性和原逻辑保持一致,不会影响任务组的完成判断逻辑。

内容的提问来源于stack exchange,提问作者Damiano Miazzi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:35:26