func detect(image: CIImage) {
        guard let model = try? VNCoreMLModel(for: Inceptionv3().model) else {
            fatalError("Loading CoreML Model failed.")
        }

        let request = VNCoreMLRequest(model: model) { (request, error) in
            guard let results = request.results as? [VNClassificationObservation] else {
                fatalError("Model failed to process image")
            }
            print(results)
        }
        print("First")

        let handler = VNImageRequestHandler(ciImage: image)

        do {
            print("Second")
            try handler.perform([request])
            print("Third")
        } catch {
            print(error)
        }

    }

इस उदाहरण में, कंसोल में जो प्रिंट होता है वह है:

पहला, दूसरा, "परिणाम", तीसरा

तो मेरा सवाल यह है कि यह कोड क्यों काम करता है, भले ही हैंडलर.परफॉर्म फ़ंक्शन अनुरोध पूर्ण करने वाले हैंडलर के अंदर न हो?

यह नोडजेएस के लिए अलग लगता है जहां "अनुरोध" चर में डेटा तैयार नहीं होता है जब यह हैंडलर.परफॉर्म तक पहुंचता है।

1
Amigo 11 मई 2020, 11:04
आपकी अपेक्षा क्या थी?
 – 
Jawad Ali
11 मई 2020, 11:15
@amigo: यह क्यों काम नहीं करना चाहिए? request एक क्लोजर है जिसे आप पास करते हैं handler.perform([request]) और .perform इस क्लोजर को स्टोर करता है और इसे एसिंक्रोनस रूप से निष्पादित करता है इसमें क्या गलत है?
 – 
Sandeep Bhandari
11 मई 2020, 11:21

2 जवाब

सबसे बढ़िया उत्तर

perform करेंगे:

सभी अनुरोधों के पूरा होने या विफल होने के बाद फ़ंक्शन वापस आ जाता है।

चूंकि अनुरोध उसके वापस आने से पहले पूरे हो जाते हैं, यह समकालिक होता है। आपने जिस कंप्लीशन हैंडलर को VNCoreMLRequest को पास किया है, उसे perform रिटर्न से पहले कॉल किया जाएगा। इसका रिटर्न वैल्यू यह भी बताता है कि सभी अनुरोध सफल हुए हैं या नहीं। यदि यह सभी अनुरोधों के पूरा होने से पहले वापस आ जाता है, तो यह कैसे पता चलेगा कि सभी अनुरोध सफल हुए हैं? :डी

perform की समकालिक प्रकृति के कारण, आपको इसे किसी अन्य प्रेषण कतार पर चलाना चाहिए, ताकि मुख्य कतार को अवरुद्ध न किया जा सके, जैसा कि Apple ने अपने सभी नमूना कोड में किया था (1, 2):

DispatchQueue.global(qos: .userInitiated).async {
    do {
        try imageRequestHandler.perform(requests)
    } catch let error as NSError {
        print("Failed to perform image request: \(error)")
        self.presentAlert("Image Request Failed", error: error)
        return
    }
}

जब आप पूरा करने वाले हैंडलर में हों तो मुख्य कतार में वापस जाना याद रखें।

0
Sweeper 11 मई 2020, 11:42

ऐसा लगता है कि यहाँ कुछ भी async नहीं है। https://developer.apple.com/documentation/vision/vnimagerequesthandler/ के अनुसार 2880297-प्रदर्शन

यदि सभी अनुरोध शेड्यूल किए गए और निष्पादित किए गए तो सही लौटाता है। यदि वापसी मान गलत है, तो त्रुटि पैरामीटर की जाँच करें।

इसलिए, यदि फ़ंक्शन वापस आता है, तो सभी अनुरोध शेड्यूल किए गए और निष्पादित किए गए हैं।

0
hhamm 11 मई 2020, 11:18