Swift 中两个线程之间的同步

问题描述 投票:0回答:1

当我启动应用程序时,我有:

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

如何同步?我本来想使用静态全局信号量,但从我搜索到的内容来看,不太推荐使用信号量。

在我想到的所有解决方案中,两个类都需要互相看到对方,但我没有相互之间的引用。

swift multithreading synchronization
1个回答
0
投票

通常有多种方法可以在不使用信号量的情况下同步工作项。在这种情况下,信号量似乎非常适合您要解决的问题。锁是另一种选择。 (您的 checkData 函数在后台线程上的工作可能会阻塞,直到网络请求释放锁为止。)

© www.soinside.com 2019 - 2024. All rights reserved.