2016-07-14 34 views
13

Şu anda Grand Central Dispatch ile oynuyorum ve DispatchWorkItem adlı bir sınıf keşfettim. Dokümantasyon biraz eksik görünüyor, bu yüzden doğru şekilde kullanma konusunda emin değilim. Aşağıdaki parçacığı oluşturdum ve farklı bir şey bekledim. Üzerine cancel numaralı telefonu aradıktan sonra öğenin iptal edilmesi bekleniyor. Ama yineleme bir sebepten dolayı devam ediyor. Ne yaptığım hakkında yanlış bir fikrin var mı? Kod benim için iyi görünüyor.GCD'de DispatchWorkItem nasıl durdurulur?

@IBAction func testDispatchItems() { 
    let queue = DispatchQueue.global(attributes:.qosUserInitiated) 
    let item = DispatchWorkItem { [weak self] in 
     for i in 0...10000000 { 
      print(i) 
      self?.heavyWork() 
     } 
    } 

    queue.async(execute: item) 
    queue.after(walltime: .now() + 2) { 
     item.cancel() 
    } 
} 

cevap

28

GCD gibi bir şey

Bahse konu API bilmiyorum ama genelde olurdu. Bu nedenle, daha önce başlatılmış olan bir iş öğesini durdurmak için, ipuçlarını kendiniz test etmeniz gerekir. isCancelled (eski adı dispatch_block_testcancel) kullanabilirsiniz.

func testDispatchItems() { 
    let queue = DispatchQueue.global() 

    var item: DispatchWorkItem! 

    // create work item 

    item = DispatchWorkItem { [weak self] in 
     for i in 0 ... 10_000_000 { 
      if item.isCancelled { break } 
      print(i) 
      self?.heavyWork() 
     } 
     item = nil // resolve strong reference cycle 
    } 

    // start it 

    queue.async(execute: item) 

    // after five seconds, stop it if it hasn't already 

    queue.asyncAfter(deadline: .now() + 5) { [weak item] in 
     item?.cancel() 
    } 
} 
+0

Teşekkürler, tam olarak aradığım şey buydu. –

+0

DispatchWorkItem iptal edildikten sonra yeniden kullanılabilir mi? – pixelfreak

+0

@pixelfreak - Hayır. Yeniden başlatmak isterseniz yeni bir tane oluşturun. – Rob

0

"İptal" yöntemini çağıran bir işlemin iptal edileceği zaman uyumsuz bir API yoktur. Her durumda, bir "İptal" yöntemi, işlemin iptal edilip edilmediğini anlayabilmesi için bir şeyler yapar ve işlem zaman zaman bunu kontrol etmeli ve daha sonra kendi başına daha fazla iş yapmayı bırakmalıdır. önleyici cancelations gerçekleştirmez

 for i in 0...10000000 { 
      if (self?.cancelled) 
       break; 

      print(i) 
      self?.heavyWork() 
     }