NSOperationQueue 的取消在 swift 中不起作用

cancellation of NSOperationQueue does not work in swift

我正在尝试使用 swift 取消 NSOperationQueue 中的所有线程,但它不起作用。

我正在尝试在用户单击按钮时使用 NSOperationQueue 启动和停止线程。此外,如果执行 myFunc 所花费的时间超过 20 秒,则计时器将停止它并显示警报。

下面是我的代码:

import UIKit

class ViewController: UIViewController {

    var myTimer = NSTimer()
    var isSet = true
    var icount = 0

    let operationQueue = NSOperationQueue()


    override func viewDidLoad() {
        super.viewDidLoad()

    }

    var th123:NSThread!


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    func myFunc()
    {
        println("Thread start..")
    }


    @IBAction func btnClickEvent(sender: AnyObject) {

       if(isSet == false)
        {
            isSet = true
            myTimer.invalidate()

            // th123.cancel()
            operationQueue.cancelAllOperations()

            btnClick.setTitle("Start", forState: UIControlState.Normal)
            //NSThread.exit()
        }
        else if (isSet == true)
        {
            isSet = false

            myTimer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: Selector("checkTime"), userInfo: nil, repeats: true)
            NSLog("Timer started..")
            btnClick.setTitle("Stop", forState: UIControlState.Normal)

            Other()

        }

    }

    func myfunc1()
    {

    }

    func checkTime()
    {
        icount = icount + 10

        if( icount > 18 ) {

            isSet = false

            operationQueue.cancelAllOperations()

            let alertController = UIAlertController(title: "iOScreator", message:
                "Opps Some Error occurred !!", preferredStyle: UIAlertControllerStyle.Alert)
            alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default,handler: nil))

            self.presentViewController(alertController, animated: true, completion: nil)
            myTimer.invalidate()
            btnClick.setTitle("Start", forState: UIControlState.Normal)
        }

    }



 func Other() {

customOperation.completionBlock = {

    MyObject.myFunc()
}


var workerBlockOperation:NSBlockOperation = NSBlockOperation.self.init(
    block: {
        MyObject.myFunc()
    }
)


    operationQueue.addOperation(customOperation)
    operationQueue.addOperation(workerBlockOperation)


}


    @IBOutlet weak var lblstatus: UILabel!
    @IBOutlet weak var btnClick: UIButton!
}

MyObject.swift 文件

导入基金会

class MyObject {

  class func myFunc()
    {
        NSLog(" myFunc called ")

        for i in 1...1000000 {
            println(i)
        }
    }

}

我更愿意使用 NSThread,但我不知道如何强制 stop/kill NSthread。

我添加了以下代码但仍然无法取消任务

取消NSOperation只是将isCanceled属性设置为true,不会停止该操作的执行,由你自己决定如何处理,通常你会在执行操作中的代码之前检查 isCancelled,类似这样。

if (!op.isCancelled){
//its means operation (op) is not cancelled
// execute cod
}

更新: 如果你使用的是 NSBLock 操作,那么它应该是这样的

customOpeation =  NSBlockOperation ()
        customOpeation .addExecutionBlock {
            if !customOpeation.cancelled
            {
                // operation is not cancelled
                // so you can execute code
                myFunc()
            }
        }

如果你想在myFunc方法中检查operation是否是cancelled,那么你需要有操作引用否则它会执行,如果你有引用你可以做这样的事情。

class MyObject {

  class func myFunc()
    {
        NSLog(" myFunc called ")

        for i in 1...1000000 {
            if operation.cancelled
            { //break loop as operation is cancelled
            }
            println(i)
        }
    }

}

如何将操作引用发送到 myFunc 将取决于您的应用程序的架构方式。

推荐 子类 NSOperation 并在其中添加功能,这样您就可以轻松检查操作是否被取消,这是推荐的方法

 class Opeation : NSOperation
    {
        override func main() {
            if !cancelled
            {
                myFunc()
            }
        }
        func myFunc()
        {
            for i in 1...1000000 {
                if cancelled
                {
                    break
                }
                println(i)
            }
        }
    }

在此之后只需创建一个 Operation 的对象并将其添加到 opeartionQueue