我有一个异步函数,可以从两个位置启动。请注意,在
getRecentMovies
,有一个
Task {}
这使得
async
网络呼叫。
触发该函数的第一种方式是:
.onChange(of: scenePhase) { newPhase in
guard newPhase == .active else {
return
}
vm.getRecentMovies()
}
因此,当视图加载到活动状态时,它将向电影端点发出API请求,我必须刷新数据
第二种方式是通过在中处理的静默推送通知
AppDelegate
来自SwiftUI。
我遇到的问题是
getRecentMovies()
,它们向API发出请求,并从以前存储的CoreData获取数据。
因此,如果用户碰巧打开了应用程序,同时收到无声推送通知,该功能将同时运行两次。这给我从CoreData获取数据带来了问题。
问题是,一个执行方法获取数据,然后继续执行,第二个方法从核心数据中获取数据。
因此,在这一点上,两个函数都有来自CoreData的相同数据。然后,函数1完成,并将其数据重新保存到CoreData。然后函数2完成,然后将数据保存到CoreData,该数据现在无效,因为现在已经有另一个保存。
我想知道是否有一种方法可以安全地确保一次只有一个线程使用一个函数。由于此函数已在后台使用运行
异步
任务
调度,我应该使用吗
NSLock
s使执行暂停。
如果我真的用了
NSLock
,函数1将获取锁,然后开始执行,然后函数2将尝试获取锁,但无法获取,因此将挂起,直到锁可用。
另一种选择是,如果我能检测到其中一个任务已经在运行,请尝试取消它。但我不知道该怎么做。