如何在swift中使用performSelectorInBackground?

时间:2016-01-07 05:51:47

标签: ios swift performselector

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?

6 个答案:

答案 0 :(得分:1)

String与表示为Selector的方法的名称相关联。您没有正确初始化SelectorString有一个初始化程序,它需要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 {

相关问题