【新サービス告知】いつでもどこでもイベントを開催できる。スマホのWebカメラを利用したVRイベントスペースサービス(Meetatcube.com)
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

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

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

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


2021-04-22 14:54:53

かっこいいカルーセル厳選3点!WebGLを使った渋い画像スライダー。

昨日カッコいいスライダーを探す旅にでていました。 よく使われるswiper など、シンプルで使いやすくデザインも良いのですが、何かもの足りない、、、。 そこで調べていくと、webglを使...

2021-04-20 14:46:43

Twillioとは何??skywayとは何が違うのか。webrtcを使う際に判断する情報。

先日webrtc開発で「twillio」といった名前を聞きました。 以前自分でskywayを使ってwebrtcを試していた際に調べた時には、無かったような気もするんだけと、KDDIが絡んでいる...

2021-04-19 13:58:21

先日久々にアップデートした妊娠週刊パパのAndroid版も。アカウント移管したいんだけど、注文ID見当たらないよ。

先日の妊娠、出産、育児関連のアプリ「妊娠週刊パパ」をAndroid studioで再リリースしようと思ってるんだけど、コンパイル失敗してエミュレータで動かせない。 多分sdkとかapiのバージ...
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!