import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@objc class myClass:NSObject {
func myFunc(){
for var i = 0; i < 10000; i++ {
print(i,[NSThread.currentThread()]);
}
}
}
var myObj = myClass()
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
_ = NSThread.init(target: myObj, selector:Selector(myObj.myFunc()),
object: nil)
}
}
当我运行上面的代码时,Xcode有一个例外。信息是
[NSThread initWithTarget:selector:object:]:target未实现 选择
如何在swift中使用performSelectorInBackground?
答案 0 :(得分:1)
String
与表示为Selector
的方法的名称相关联。您没有正确初始化Selector
。 String
有一个初始化程序,它需要myObj.myFunc()
,所以你不应该传递它"myFunc"
。相反,你应该传递它viewPager.setOffscreenPageLimit(0)
。有关详细信息,请参阅此问题:
@selector() in Swift?
答案 1 :(得分:0)
您可以使用执行选择器,如下所示:
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
_ = NSThread.init(target: myObj, selector:Selector("myFunc"),
object: nil)
}
要在后台执行某项任务,您可以使用调度程序替代performSelectorInBackground。
let backgroundQueue = dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)
dispatch_async(backgroundQueue) { () -> Void in
self.myFunc()
}
答案 2 :(得分:0)
需要注意两点:
首先,使用performSelectorInBackground的类必须在NSObject中。
第二,performSelectorInBackground(Selector("myFunc"), withObject: nil)
是正确的。 myFunc是函数名。
答案 3 :(得分:0)
简单回答:你没有。使用dispatch_async。
答案 4 :(得分:0)
这对我有用
performSelector(inBackground: #selector(Selection_Button(url:)), with: finalPath2)
答案 5 :(得分:0)
请注意,在后台执行任务的最新语法是:
let backgroundQueue = DispatchQueue.global(qos: .background)
backgroundQueue.async {
// Do stuff in the background
DispatchQueue.main.async {
// Pass to the main queue for UI work etc
}
}
如果您是在后台队列中引用self
,则可能要在[weak self] in
之后添加.async {
。