iOS
Swift
Xcode6

特定の処理の完了を待ってから次の処理へと移りたい場合の実装

More than 3 years have passed since last update.


開発中に生じた問題

・ViewDidLoad()内にClass A,B,Cをインスタンス化したa,b,cの順に処理を行いたいのだが、

実際のところb,c,aの順に処理が行われ想像通りの結果になってくれない。


問題の原因

・a,b,cの処理が非同期で行われるため処理が早く終わる順になってしまう。(同期処理に変更、または実質同期処理にしたら良いのでは)

非同期:レスポンスを待っている間に他の処理も行える。

同期:レスポンスが車で他の処理を行わずにレスポンスを待ち続ける。


問題解決へのアプローチ

・現在a,b,cの順に処理が行われてしまうのは非同期なため、処理が早く終わる順になっているのでb,a,cの順に処理が行われてしまう。そのため、aの処理が終わってからb,cの処理を行うようaを同期処理にする。

・解決方法として、処理が遅いクラスaで特定の処理が終わった際にViewControllerへ通知しb,cの処理を行う方法を今回実装してみました。


コード

・freeNameとなっている箇所は使用場面に応じて適切な変数名、関数名を決めてください。


ViewController.swift

import UIKit

class ViewController: UIViewController {

var a = A()
var b = B()
var c = C()

// Define Notification(定義
let freeName = "freeName"

override func viewDidLoad() {
super.viewDidLoad()

a.getElement()

// Register Notification(登録)
NSNotificationCenter.defaultCenter().addObserver(
self,
selector: "freeName:",
name: freeName,
object: nil
)
}

// Notification Method(通知受信時のメソッド)
func freeName(notification: NSNotification) {
//aの処理後行いたい処理を記入
b.getElement()
c.getElement()
}
}



A.swift


import UIKit

class A: UIViewController{
// Define Notification(定義)
let freeName = "freeName"
// Post Notification(送信)
let ns = NSNotificationCenter.defaultCenter()
func getElement(){
//行いたい処理を記入

ns.postNotificationName(freeName, object: nil)
}
}


※以下C.swiftも同様な内容


B.swift

import UIKit

class B: UIViewController{
func getElement(){
//行いたい処理を記入
}

}



最後に

今回はNSNotificationを使って実装してみましたが、以前Qiitaに投稿したUIScrollView内に複数の画像を表示し、タップされた画像を判別する方法こちらのほうでデリゲートを使用した値渡しを行った同様の処理で今回の問題を解決する別アプローチがあるような気がしたので試してみたいと思います。


参考

サイト

siro:chro URL:http://www.sirochro.com/note/swift-nsnotification-usage/