2017-04-20 73 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