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でのループ処理は過去記事のこちらをご確認ください。

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

CoreTextでTextViewの一文字の向きを変える(#2)

さて、サンプルそのままだと面白くないので、本日6月から開始する自転車規制強化 にのっかったサンプル<自転車の転だけ横に曲げる>にしてみます。(14歳以上が対象。自転車のイヤホン装着や片手走行、 酔っ払い運転、歩道運転、片手スマホ、、、、今まで誰もがやり通してきたことが「逮捕や補導の対象」となるようです。赤切符もきられる ようになるとのことで、自転車に酔っ払ってのって自動車の免停なんかになりかね無いので注意です)

NSFileManagerでAPP保存領域のデータ操作

ファイルやディレクトリ作成はなんとなく面倒くさいイメージがありましたが、この記事で少し自分の中で壁が低くなった気がします。 よろしければご利用くださいませ。

RSSリーダで利用するAPIを検証してみる

ニュースアプリの様なRSSを表示させたいのですがXMLを処理するAPIが数点存在するようです。 Swiftにあったものを見つけ出せたらと思います。
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!