はじめに
DispatchQueue.main、globalで疲れませんか?そんな時にperformSelectorです。
使い方
メインスレッド
performSelector(onMainThread: Selector, with: Any?, waitUntilDone: Bool)
・onMainThread:Selectorで@objc funcでメインスレッドで実行する処理を指定
・with:メソッドの引数で引数なしならnil
・waitUntilDone:メインスレッドで本処理が終わるまで現在のスレッドをブロックするかを決める
バックグラウンド
performSelector(inBackground: Selector, with: Any?)
・inBackground:Selectorで@objc funcでメインスレッドで実行する処理を指定
・with:メソッドの引数で引数なしならnil
使用例
例えば、あるURLにアクセスしてjsonを取得したい場合、
ネットワーク処理自体はバックグラウンドでやりたいけど、エラーはAlertを表示させるからメインスレッドで処理したい時は以下のようになります。
override func viewDidLoad() {
super.viewDidLoad()
//バックグラウンド処理で実行
performSelector(inBackground: #selector(fetchJSON), with: nil)
}
//バックグラウンドで処理したい
@objc func fetchJSON() {
let urlString: String
urlString = "https://fdsfdsfdsafdasfdsa.json"
if let url = URL(string: urlString) {
if let data = try? Data(contentsOf: url) {
parse(json: data)
return
}
}
//エラー処理だけはAlertを出すのでメインスレッドで処理する
performSelector(onMainThread: #selector(showError), with: nil, waitUntilDone: false)
}
//Alertを出すのでメインスレッドで処理したい
@objc func showError() {
let ac = UIAlertController(title: "エラー", message: "エラーです", preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
present(ac, animated: true)
}
まとめ
performSelectorを使うとメインとバックグラウンドの処理の切り分けが楽になって可読性が高まるかと思います。
ただ、performSelectorの場合スレッド管理なども気にしないといけないようですので、単純な処理以外はDispatchQueueがやはり必要だと感じました。
公式のページはここです。
iOS開発のおすすめ書籍
あの実装方法どうだったっけ?を解決してくれます。swiftの文法から部品、ネットワーク、各種センサーなど端末機能の使い方まで対応しており、あると便利な一冊です。
Swiftの勉強をするならUdemyがおすすめ!
私はUdemyでSwiftの勉強をしてアプリを自作して公開出来るようになりました。
特に以下のコースは基礎的なUIKitの使い方からAR、機械学習(CoreML)までiOSの機能を網羅しており、図解が豊富なハンズオン形式なのでアプリを作りながら楽しく学べます。
2022/12/27時点で評価数80000越えのSwiftのトップコースです。
iOS & Swift – The Complete iOS App Development Bootcamphttps://www.udemy.com/courses/search/?src=ukw&q=swift
初回は大幅な割引があったり、Udemyは定期的な割引もしていますので良ければ是非。
なお上記は英語のコースになりますが日本語字幕に対応しています。一応以下で英語コースの勉強方法(日本語化)を記載しています。ご参考にどうぞ。
もしご参考になりましたら下部にある役に立ったボタン、TwitterなどSNSへの投稿をしていただけると励みになります
コメント