2016-07-14 7 views
13

मैं वर्तमान में ग्रैंड सेंट्रल डिस्पैच के साथ खेल रहा हूं और DispatchWorkItem नामक एक कक्षा की खोज की है। प्रलेखन थोड़ा अपूर्ण लगता है इसलिए मुझे इसे सही तरीके से उपयोग करने के बारे में निश्चित नहीं है। मैंने निम्नलिखित स्निपेट बनाया और कुछ अलग होने की उम्मीद की। मुझे उम्मीद है कि इस पर cancel पर कॉल करने के बाद आइटम रद्द कर दिया जाएगा। लेकिन पुनरावृत्ति किसी कारण से जारी है। कुछ मालूम है मुझसे क्या गलत हो रहा है? कोड मेरे लिए ठीक लगता है।जीसीडी में डिस्पैच वर्कइटम को कैसे रोकें?

@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() 
    } 
} 

उत्तर

28

GCD की तरह कुछ रिक्तिपूर्व cancelations प्रदर्शन नहीं करता। इसलिए, एक कार्य आइटम को रोकने के लिए जो पहले ही शुरू हो चुका है, आपको खुद को रद्द करने के लिए परीक्षण करना होगा। आप isCancelled (पूर्व में dispatch_block_testcancel के रूप में जाना जाता है) का उपयोग कर सकते हैं।

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

धन्यवाद, यह वही है जो मैं ढूंढ रहा था। –

+0

रद्द किए जाने के बाद DispatchWorkItem का पुन: उपयोग किया जा सकता है? – pixelfreak

+0

@pixelfreak - नहीं। अगर आप इसे फिर से शुरू करना चाहते हैं तो नया बनाएं। – Rob

0

कोई एसिंक्रोनस एपीआई नहीं है जहां "रद्द करें" विधि को कॉल करने से एक चल रहे ऑपरेशन को रद्द कर दिया जाएगा। प्रत्येक मामले में, एक "रद्द करें" विधि कुछ करेगी ताकि ऑपरेशन पता लगाया जा सके कि इसे रद्द कर दिया गया है, और ऑपरेशन को समय-समय पर यह जांचना चाहिए और फिर अपने आप से अधिक काम करना बंद कर देना चाहिए।

मैं प्रश्न में एपीआई पता नहीं है, लेकिन आम तौर पर यह होगा

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

      print(i) 
      self?.heavyWork() 
     } 
संबंधित मुद्दे