2015-04-21 70 views
1

我用GCD執行後臺執行。但是在我的ViewController類中有按鈕。一旦用戶點擊按鈕,我可以在執行之間停止GCD? 這裏是我的代碼如何在執行之間停止GCD

dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_BACKGROUND.value), 0), { 
         self.StartProcess() 
        })  
@IBAction func buttonIsClicked(sender: AnyObject) { 
// how to stop GCD execution? 
} 
+1

你需要一個變量從你的IBAction傳遞給後臺線程,它應該停止。後臺線程必須定期查詢變量。 – Volker

+0

無論如何安全地強制取消進行中的飛行操作,無論使用哪種方法來發送,都沒有辦法。在Swift和Objective-C中(以及更一般地說,在任何*非垃圾收集的運行時)都是如此。您必須設置一種方式來通知機上操作應該清理並提前返回。這已在其他問題,包括(我)在其他問題多次處理:http://bit.ly/1OCirkM和在這裏:http://bit.ly/1Dd2zjo – ipmcc

+0

感謝您的解釋和參考 –

回答

-1

創建一個NSThread數組並取消最後一個元素。

var threads = [NSThread]() 
dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_BACKGROUND.value), 0), { 
         self.StartProcess() 
         threads.append(NSThread.currentThread()) 
        })  

@IBAction func buttonIsClicked(sender: AnyObject) { 
    threads.last.cancel() 
} 
+0

這很重要複雜的,爲什麼不停止處理,如果一個變量設置爲停止? – Volker

+0

這實際上並沒有做任何事情來停止執行。它只是將線程標記爲已取消。在該線程中運行的代碼必須明確檢查線程是否已被取消並提前退出。只要調用'cancel'實際上不會做任何事情。請參閱文檔:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSThread_Class/index.html#//apple_ref/occ/instm/NSThread/cancel – ipmcc

-1
 func someBackgroundTask(timer:NSTimer) { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {() -> Void in 
      println("do some background task") 

      dispatch_async(dispatch_get_main_queue(), {() -> Void in 
       println("update some UI") 

      }) 
    }) 
} 

停止該定時器和按鈕的背景execcution點擊

timer.invalidate()

,然後通過定時器調用這個方法

var timer = NSTimer(timeInterval: 1.0, target: self, selector: "someBackgroundTask:", userInfo: nil, repeats: true) 

@IBAction func buttonIsClicked(sender: AnyObject) { 
      timer.invalidate() 
} 
+0

我不使用這種方法作爲viewDidLoad()finction的dispatch_async塊調用 –