用NSInvocation來作為object performSelector的替代方案
在寫程式的時候, 常常會有需要呼叫好幾個method, 然後在時間上有所需別; 最常遇到的都是希望Layout改變完成之後再去執行下一步動作, 如果是一堆layout animation, 就會很常使用到delay去做一些時間差的區別.
1 2 3 4 5 6 7 |
|
一開始使用的時候覺得還好, 但是慢慢的發現如果我的method一開始寫的時候帶入多個參數, 如果用上面的方式, 就要改寫本來的method, 這樣又得花時間, 而且可能最後都是帶入NSDictionary
的物件, 在把需要的資料拉出來, 常常會把map的key打錯又多花很多時間在debug.
在StackOverflow上查了參數數量的問題, 沒想到還真的有一個很棒的解法, 就是 NSInvocation
.
NSInvocation
NSInvocation的使用有一個地方要特別注意, invocation不能使用 alloc
跟init
來建立實體, 只能使用invocationWithMethodSignature:
來建立object.
1 2 3 |
|
使用Invocation, mehtod所帶入的參數也不用都轉成object, int、BOOL…etc.都可以使用
1 2 3 |
|
我們先使用NSObject
的instance mehtod(也可以使用Class mehtod, 依照個人使用習慣), 先取得一個NSMethodSignature
物件, 並建立一個NSInvocation.
NSMethodSignature的numberOfArguments最小值是2; 0跟1是給預設的隱藏參數使用(self & _cmd). 從2開始才是method-spec使用.
這時取得的invocation只有簡單的method可帶入的argument數量, 在正式調用之前你還需要設定target
跟selector
.
1 2 3 4 5 6 7 |
|
使用NSInvocation設定參數時, index要從2開始.
1 2 3 |
|
如果要延遲的話可以這樣使用
1
|
|
要注意的是, 如果會需要取得回傳值, 可能不適合使用delay的方式~