2017-04-20 63 views
0

我試圖使用performSelector來實現協議/委託,但我得到這個錯誤:斯威夫特:類型的值沒有任何成員「peformSelector」

Value of type 'DoingSomething' has no member 'peformSelector' 

這是我實現:

import UIKit 
protocol DoingSomethingDelegate { 
    // delegate function 
} 

class DoingSomething { 
    func goDoSomething() 
     self.performSelector(onMainThread: #selector(self.processSomething()), with: nil, waitUntilDone: true) 
    } 
    func processSomething() { 

     print("I'm done") 
    } 
} 

但是,如果我將函數移動到viewController我沒有錯誤。你們中的任何一個人都知道錯誤的原因,或者我該如何解決這個錯誤?

我真的很感謝你的幫助。

+0

這是一個'NSObject'方法,你的類不從'NSObject'繼承 – dan

+1

考慮'DispatchQueue.main.sync'。 'performSelector ...'已經過時了(在Swift中)。 – vadian

+0

@dan,向類中添加NSObject使其成爲訣竅:class DoingSomething:NSObject – user2924482

回答

1

每@丹評論我所做的更改:

class DoingSomething:NSObject { 

    func goDoSomething() { 

     self.performSelector(onMainThread: #selector(self.processSomething), with: nil, waitUntilDone: true) 
    } 

    func processSomething() { 

     print("I'm done") 
    } 
} 

是現在工作!

+0

這不是一個好的解決方案。爲什麼添加擴展'NSObject'的不必要的包袱,以便當@vadian聲明並使用'DispatchQueue.main.async'的更好的解決方案時你可以調用'performSelector'。 – rmaddy

+0

@rmaddy,爲什麼DispatchQueue.main.sync更好,然後performSelector? – user2924482

+0

因爲你正在使用Swift。爲什麼要擴展'NSObject'?並且使用'DispatchQueue'給你提供更多的選擇。 'performSelector'非常有限,很容易讓'#selector'語法錯誤。 – rmaddy

1

正如@vandian在他的評論中所建議的,您應該考慮使用GCD來代替。等效的代碼是:

DispatchQueue.main.async { 
    self.processSomething() 
} 

使用async()有兩個好處。您可以在線提供代碼,而無需編寫單獨的函數,從而更易於閱讀和維護;您執行關閉訪問封閉範圍內,所以你可以從代碼中的功能,如使用變量:

func localScopeFunc { 
    var x: Int = 6 
    DispatchQueue.main.async { 
    //This block of code has access to the local variables from localScopeFunc 
    print("x = \(x)") 
    } 
} 

隨着performSelector()和它的變種就只能用零啓動功能,一個或2個參數,並且這些參數必須是NSObjects

強制一個對象成爲NSObject的子類也有一些小缺點。這迫使編譯器使用動態調度,這比Swift使用的靜態調度稍慢。

+0

performSelector可以選擇等待完成。 DispatchQueue.main.async是否會等待處理代碼塊? – user2924482

+0

@ user2924482如果您想等待,並且100%知道您不在主隊列中,請使用DispatchQueue.main.sync而不是DispatchQueue.main.async。 – rmaddy

+0

@rmaddy,這是有道理的。謝謝 – user2924482

相關問題