2016-07-24 7 views
11

जीसीडी पर स्विफ्ट 3 विकास पढ़ने के बाद, मैं प्रेषण समूह बनाने की कोशिश कर रहा हूं। समस्या group.notify(queue: है जब मैं DispatchQueue.main को कतार के रूप में पास करता हूं, तो यह सूचित नहीं करता है, हालांकि यह पृष्ठभूमि कतार के लिए काम करता है।डिस्पैच समूह - मुख्य धागे को सूचित नहीं कर सकता

इसके अलावा, मैं, यकीन है कि मेरे वाक्य रचना सब सही है नहीं कर रहा हूँ के रूप में मैं स्विफ्ट 3.

typealias CallBack = (result: Bool) -> Void 
func longCalculations (completion: CallBack) { 

let backgroundQ = DispatchQueue.global(attributes: .qosBackground) 

    let group = DispatchGroup() 
    var fill:[Int] = [] 
    for item in 0...200 { 
     group.enter() 
     if item > 50 { 
      fill.append(item) 
     } 
     group.leave() 
    } 

//Below in the notify argument If I pass `backgroundQ`, it seems to work correctly but not when DispatchQueue.main is passed. 

को स्विफ्ट 2 से कोड में परिवर्तित करने कोशिश कर रहा हूँ इस कोड काम नहीं करते

group.notify(queue: DispatchQueue.main, execute: { 
    completion(result: true) 
    }) 
} 

यह सही ढंग से काम करता है

group.notify(queue: backgroundQ, execute: { 
    completion(result: true) 
    }) 
} 
_______________________________________________________ 

longCalculations() { print($0) } 
+0

क्या है कोड है कि _doesn't_ "सही ढंग से काम?" – matt

+0

@ मैट, मैंने स्पष्टता के लिए प्रश्न संपादित किया है, जब मैं 'group.notify (queue: DispatchQueue.main, execute: {' समापन ब्लॉक कुछ भी नहीं लौटाता है ('बूल' मान मुद्रित करने में असमर्थ), जहां के रूप में मैं एक समवर्ती कतार 'पृष्ठभूमिक्यू' पास करता हूं, 'बूल' मान' सत्य 'वापस लौटाया जाता है और सही ढंग से मुद्रित किया जाता है' लंबी गणना() {प्रिंट ($ 0)} ' – jyet

+2

आप 'एंटर' और 'छोड़' गलत तरीके से उपयोग कर रहे हैं। आप इस लेख को पढ़ने के लिए: http://amro.co/gcd-using-dispatch-groups-for-fun-and-profit – matt

उत्तर

24

मैट द्वारा सुझाए गए पोस्ट को पढ़ने के बाद, मैंने पाया कि मैं मुख्य कतार में कार्य सबमिट कर रहा था और जब मैंने मुख्य धागे पर अधिसूचित होने के लिए कहा, तो यह डेडलॉक में आया।

मैं कोड बदल दिया और अब यह रूप में इरादा काम कर रहा है,

typealias CallBack = (result: [Int]) -> Void 
func longCalculations (completion: CallBack) { 
    let backgroundQ = DispatchQueue.global(attributes: .qosDefault) 
    let group = DispatchGroup() 

    var fill:[Int] = [] 
    for number in 0..<100 { 
     group.enter() 
     backgroundQ.async(group: group, execute: { 
      if number > 50 { 
      fill.append(number) 
      } 
      group.leave() 

      }) 
     } 

    group.notify(queue: DispatchQueue.main, execute: { 
     print("All Done"); completion(result: fill) 
    }) 
} 

longCalculations(){print($0)} 
संबंधित मुद्दे