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
我正在尝试使用 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