Swift転職なら=>【LevTech】
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

頭痛が減ったので共有です!

rebuild.fmを応援しています!

HOME > NSThread

NSThreadでスレッド処理を行う

サンプル画像

タイマー処理と同様に利用できるスレッドの処理です。NSTimerではヒゲがのびたサンプルでしたので眉毛の濃くなるサンプルにしてみます。ただ、どうやらThread処理は 推奨されておらず、dispatch_queueを使用するべきのようです。

NSThreadのクラス階層


NSObject

NSThread

参考:Foundation Framework Reference NSThread Class Reference
参考:How to implement NSThread to constantly perform the function in background in iPhone SDK
参考:performSelector:onThread: in Swift?

やってみた

以下のサンプルでは一秒後にeyeblowAlphaUp関数を呼びます


    let delay = 1.0 * Double(NSEC_PER_SEC)
    var time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
    dispatch_after(time, dispatch_get_main_queue(), {
        NSThread.detachNewThreadSelector(Selector("eyeblowAlphaUp:"), toTarget:self,withObject: nil);
    })

    func eyeblowAlphaUp(obj:AnyObject){
        println("眉毛が濃くなりました")
    }

繰り返し利用したい場合、は関数内にあらためてdispatch_timeします


    let delay = 1.0 * Double(NSEC_PER_SEC)
    var time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
    dispatch_after(time, dispatch_get_main_queue(), {
        NSThread.detachNewThreadSelector(Selector("eyeblowAlphaUp:"), toTarget:self,withObject: nil);
    })

    func eyeblowAlphaUp(obj:AnyObject){
        println("眉毛が濃くなりました")
        let delay = 1.0 * Double(NSEC_PER_SEC)
        var time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
        dispatch_after(time, dispatch_get_main_queue(), {
            NSThread.detachNewThreadSelector(Selector("eyeblowAlphaUp:"), toTarget:self,withObject: nil);
        })
    }

どうしてもNSThreadでタイマーのような処理をしたい場合はCFRunLoopRefを利用します。トライしましたが時間内にうまくいかず、、、こちらの記事をご確認ください。

カスタマイズ

以下のようにボタンのクリックイベントを模倣させることもできます


  let delay = 1.0 * Double(NSEC_PER_SEC)
    var time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
    dispatch_after(time, dispatch_get_main_queue(), {
       NSThread.detachNewThreadSelector(Selector("btn_click:"), toTarget:self, withObject: "button")
    })

    //ボタンがクリックされると呼ばれます
    func btn_click(sender: UIButton){
        println("button is clcked!")
    }

追記

自分でコーディングしていると、dispatch_afterでNSThreadの処理全般を書いていたのですが、NSThreadはもっと賢こかったので、 補足説明です。

参考:GCD (Grand Central Dispatch) – Dispatch Queue でマルチスレッドプログラミング

dispatch_async:スレッドで非同期実行

dispatch_sync:スレッドで同期実行

dispatch_after:一定時間後に実行

dispatch_group_***:まとめて実行

dispatch_once:一度だけのdispatch_sync。名前が違うだけかな

まとめ

NSTimerをつかわないでNSThreadでももっとスマートな方法がある気がするのですが、、、わからなかったのでこの方法で共有です。NSTimerでのループ処理は過去記事のこちらをご確認ください。

↓こんな記事もありますよ!

アイコン一括作成サービス紹介

アプリのアイコンを作るのは手間で面倒くさい。と、思いながらPhotoshopで一つ一つサイズを変えて作っていたのですが、 簡単につくれるサービスやっぱりありました。Macのスクリプトだったり、Webサービスだったりと揃っていましたので共有します。

CoreTextをイラストで理解してみる

上記がAppleのCoreText説明に記載されているイラスト図ですが正直よくわかりません。文章を三角や丸等の領域に表示したり、一行だけ表示したり、一文字だけ表示したり、 と様々な使い方ができるようです。

Swiftがオープンソース化!!!(WWDC2015)

2:22:00からSwiftの話です!オープンソースを発表したタイミングは2:23:28のあたり。拍手喝采です。
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!