Swift:类型的值没有成员' peformSelector'

时间:2017-04-20 17:11:17

标签: ios swift3

我尝试使用performSelector实现协议/委托,但我收到此错误:

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,我没有错误。你们中的任何人都知道错误的原因或如何解决这个错误?

我非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

Per @dan评论我做了改动:

class DoingSomething:NSObject {

    func goDoSomething()  {

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

    func processSomething() {

        print("I'm done")
    }
}

现在正在运作!

答案 1 :(得分: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()及其变体,您只能使用零个,一个或两个参数调用函数,并且这些参数必须为NSObjects

强制对象成为NSObject的子类也有一些小的缺点。这迫使编译器使用动态调度,这比Swift使用的静态调度稍慢。