2016-10-04 5 views
5

के तहत समेकित रूप से चलता है सिएरा के तहत मेरे कोड का परीक्षण करने में, मैंने पाया कि समवर्ती कतारों को पहले संभालने वाली विधियां अब काम नहीं कर रही थीं।DispatchQueue.concurrentPerform (पुनरावृत्तियों :) का उपयोग कर स्विफ्ट ऐप अब मैक ओएस सिएरा

मेरे सी ++ कोडबेस में त्रुटि का विश्लेषण करने में, उपयोगकर्ताओं में से एक ने कतार घोषित करने के लिए स्पष्ट रूप से नामकरण करने वाले एक कार्यवाही का सुझाव दिया (इस पोस्ट को देखें: C++11 app that uses dispatch_apply not working under Mac OS Sierra) ऐसा लगता है कि समस्या हल हो गई है।

स्विफ्ट 3 में, निम्न कोड समवर्ती को बंद करने पर अमल करने के लिए इस्तेमाल किया जाएगा, लेकिन यह ऊपर पोस्ट में एक समान है, लेकिन सी ++ उदाहरण के लिए प्रदर्शन किया गया है:

import Foundation 
import GameKit 

DispatchQueue.concurrentPerform(iterations: 1000) { index in 
    let pauseTime = GKRandomSource.sharedRandom().nextInt(upperBound: 5) 
    sleep(UInt32(pauseTime)) 
    print(index) 
} 

... फिर भी, जब मैं इसे निष्पादित करें, यह प्रत्येक ब्लॉक को क्रमशः चलाता है और सूचकांक संख्यात्मक क्रम में आउटपुट होते हैं।

कोई भी जानता है कि स्विफ्ट में प्रेषण के मुद्दों के लिए मेरे "समवर्ती" समाधान को हल करने के लिए मैं उस पोस्ट में अनुशंसित कार्यवाही का लाभ कैसे उठा सकता हूं?

+0

आप मुख्य थ्रेड पर कॉल 'concurrentPerform()' है? – duemunk

+0

अनिश्चित। आप जो देखते हैं वह सचमुच संपूर्ण स्रोत कोड है। जैसा कि मैंने एक स्विफ्ट कंसोल एप्लिकेशन बनाया है, और यह मेरी Program.swift फ़ाइल का मुख्य भाग है। क्या मुख्य थ्रेड पर चलाने के लिए डिस्पैच्यूयू क्लास के लिए यह डिफ़ॉल्ट है? – Charles

+2

इसे गैर-मुख्य धागे पर बुलाया जाना चाहिए। मुझे इसके लिए कोई दस्तावेज नहीं मिला है, लेकिन मेरे पास अच्छी तरह से परीक्षण किया गया कोड है जो काम करता है जैसा कि मैं उम्मीद करता हूं। https://github.com/duemunk/Async/blob/master/Source/Async.swift#L538-L540 – duemunk

उत्तर

0

बिल्डिंग duemunk की टिप्पणी पर, यहाँ है कैसे मैं एक पृष्ठभूमि कतार पर समानांतर में एक समारोह performFunction लागू होते हैं:

let queue = DispatchQueue(label: "myQueue", qos: .userInteractive, attributes: .concurrent) 
    queue.async { 
     DispatchQueue.concurrentPerform(iterations: iterations) { 
      index in 
      performOperation(index) 
     } 
    } 
संबंधित मुद्दे