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
相关产品推荐
相关产品推荐

