swift で NSInvocation っぽいことをやってみた

Objective-C - NSInvocation を使ってクラスメソッドを呼ぶ - Qiita
SwiftでのNSInvocation - Qiita

Selector で withObject を使って複数のパラメータを渡そうと思ったら、NSInvocation を使うといいよってグーグル先生に言われたんだけど、 swiftでは使えないらしい

どうしたかというと、NSMutableDictionary に突っ込んでみた。

//遅延ロード
func delayLoad(path: String,url: NSURL ,img: UIImageView, img2: UIImageView) {
        let delay = 0.2 * Double(NSEC_PER_SEC)
        // 0.2秒遅延
        var time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
        var dic: NSMutableDictionary = NSMutableDictionary()
        dic.setObject(path, forKey: "PATH")
        dic.setObject(url, forKey: "URL")
        dic.setObject(img, forKey: "IMG")
        dic.setObject(img2, forKey: "IMG2") //オプションImageView
        dic.setObject(currentId, forKey: "CUID") // 現在処理中のID
        dispatch_after(time, dispatch_get_main_queue(), {
            NSThread.detachNewThreadSelector(Selector("delayLoadMethod:"), toTarget: self, withObject: dic)
        })
    }

呼び出し元

func delayLoadMethod (dic: NSDictionary) {
        var uii: UIImage
        var img: UIImageView
        var img2: UIImageView
        var cuid: String
        var path: String
        var url: NSURL
        var imageData1: NSData
        var err: NSError?
        path = dic.objectForKey("PATH") as! String
        img = dic.valueForKey("IMG") as! UIImageView
        url = dic.valueForKey("URL") as! NSURL
        cuid = dic.valueForKey("CUID") as! String
        img2 = dic.valueForKey("IMG2") as! UIImageView
        if cuid == currentId {
             // やりたい処理
        }
    }

セレクターの呼び出し先

ちなみに、代入時に、NSMutableDictionary ではなく、NSDictionary 使ったらクラッシュした。
UIImageView を渡したいときは、NSMutableDictionary を使うようにグーグル先生に言われた。

Dictionary と NSDictionary とNSMutableDictionary の違いがよく分かってなかったり

NSのプレフィクスの意味は、NeXTSTEPの略称 らしいのだけどね…。

swift 始めたばっかりなのでよくわからない・ω・

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です