当我启动应用程序时,我有:
class PremiumManager: SKProductsRequestDelegate {
static let sharedInstance = PremiumManager()
static func loadProducts() {
sharedInstance.load()
}
func load() {
let productsRequest = SKProductsRequest(productIdentifiers:["some_id"])
productsRequest.delegate = self
productsRequest.start()
}
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
//so some work
}
func request(_ request: SKRequest, didFailWithError error: Error) {
}
}
在
AppDelegate
我这样做:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
PremiumManager.loadProducts()
}
现在在我的
MainViewController
里面viewDidLoad
我有代码:
class MainViewController: UIViewController {
override func viewDidLoad() {
initVars()
checkData()
}
func initVars() {
//some variables init
}
func checkData() {
DispatchQueue.global(qos: .userInitiated).async {
//do some background tasks to sync data with server using inited variables
}
}
}
问题是,我只想在
checkData
完成(成功或失败)之后以及 productsRequest
完成后运行 initVars
。
如何同步?我本来想使用静态全局信号量,但从我搜索到的内容来看,不太推荐使用信号量。
在我想到的所有解决方案中,两个类都需要互相看到对方,但我没有相互之间的引用。
通常有多种方法可以在不使用信号量的情况下同步工作项。在这种情况下,信号量似乎非常适合您要解决的问题。锁是另一种选择。 (您的 checkData 函数在后台线程上的工作可能会阻塞,直到网络请求释放锁为止。)