1. ホーム
  2. アイオス

[解決済み]SwiftでどのようにGCDメインスレッド上のパラメータを持つメソッドを呼び出すには?

2022-04-14 22:36:58

質問

私のアプリでは、NSRURLSession を作成し、NSURLRequest を送信する関数があります。

sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error)

このタスクの完了ブロックでは、呼び出したビューコントローラに UIImage を追加する計算を行う必要があります。という func があります。

func displayQRCode(receiveAddr, withAmountInBTC:amountBTC)

で、UIImage-adding の計算を行います。補完ブロックの中でビューを追加するコードを実行しようとすると、Xcodeは、バックグラウンド・プロセスの間はレイアウト・エンジンを使用できないというエラーを投げます。そこで、メインスレッドにメソッドをキューイングしようとするコードをSOで見つけました。

let time = dispatch_time(DISPATCH_TIME_NOW, Int64(0.0 * Double(NSEC_PER_MSEC)))

dispatch_after(time, dispatch_get_main_queue(), {
    let returned = UIApplication.sharedApplication().sendAction("displayQRCode:", to: self.delegate, from: self, forEvent: nil)
})

しかし、この関数呼び出しにパラメータ "receiveAddr" と "amountBTC" をどのように追加すればよいのか分かりません。また、アプリケーションのメインキューにメソッド呼び出しを追加するための最適な方法をどなたか教えてください。

どのように解決するのですか?

最近のSwiftのバージョンでは DispatchQueue.main.async を使用してメインスレッドにディスパッチします。

DispatchQueue.main.async { 
  // your code here
}

への 派遣する を主キューで使用します。

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
  // your code here
}

古いバージョンのSwiftを使用。

dispatch_async(dispatch_get_main_queue(), {
  let delegateObj = UIApplication.sharedApplication().delegate as YourAppDelegateClass
  delegateObj.addUIImage("yourstring")
})