2015-04-21 4 views
1

Я использовал GCD для выполнения фона. однако в моем классе ViewController есть кнопка. Как я могу остановить GCD между выполнением, как только пользователь нажмет кнопку? вот мой кодкак остановить GCD между выполнением в swift

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

i do not использовал этот подход, поскольку мой вызов dispatch_async блокирует из viewDidLoad() finction –

Смежные вопросы