खोलने के बाद अधिक समय लगता है मैं नेटवर्क पर सेवाओं का पता चलने के लिए निम्न कोड:NSNetServiceBrowser didRemoveService धारा
[netServiceBrowser setDelegate: self];
[netServiceBrowser searchForServicesOfType: serviceType inDomain: domain];
कि इन दोनों तरीकों के लिए कॉल में परिणाम (सेवा खोजने के लिए और सेवा निकालने के लिए):
- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser
didFindService:(NSNetService*) netService ... {}
- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser
didRemoveService:(NSNetService*) netService ... {}
यह ठीक काम करता है। जब मैं अपना डिवाइस बंद करता हूं I तत्कालdidRemoveService कॉल प्राप्त करें।
लेकिन जब मैं एक धारा डिवाइस के लिए (इनपुट, आउटपुट या दोनों) को खोलने:
[netService getInputStream: &inputStream outputStream: &outputStream];
[inputStream setDelegate: self];
[outputStream setDelegate: self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode: NSDefaultRunLoopMode];
[inputStream open];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[outputStream open];
यह अचानक NSNetServiceBrowser लगभग एक मिनट का पता लगाने के लिए कि मैं उपकरण बंद लेता है
(यह लेता है एक के लिए मिनट किया गया था RRove सेवा कहा जाता है)।
जिन उपकरणों के साथ मैं संचार नहीं कर रहा हूं (जिनके साथ स्ट्रीम खोल रहा है) अभी भी didRemoveService पर कॉल करते हैं जैसे ही मैं उन्हें हटा देता हूं।
अद्यतन: यहां मेरी समस्या से संबंधित कुछ और जानकारी है।
मैं Wireshark के साथ एक ट्रेस भाग गया और चला है कि निम्न है:
मैं iPad सिम्युलेटर में अपने आवेदन शुरू करते हैं, आवेदन एक NSNetServiceBrowser शुरू होता है और प्रिंटर का पता लगाता है। उसके बाद यह डिवाइस/इनपुट (आउटपुट एक्सप्रेस, यूएसबी के माध्यम से) इनपुट/आउटपुट स्ट्रीम खोलता है। प्रिंटर मुझे स्थिति अपडेट भेज रहा है और जब मैं में परीक्षण बटन टैप करता हूं तो मेरा ऐप प्रिंटर प्रिंटिंग शुरू करता है। Wireshark में मैं प्रिंटर के साथ अपेक्षित सभी संचार देखता हूं।
अब जब मैं आईपैड पर एक ही एप्लीकेशन शुरू करता हूं (और आईपैड सिम्युलेटर चल रहा है)। एप्लिकेशन NSNetServiceBrowser भी शुरू करता है, और प्रिंटर का पता लगाता है। प्रिंटर मुझे स्थिति अपडेट नहीं भेज रहा है और जब मैं परीक्षण बटन टैप करता हूं, प्रिंटर प्रिंट नहीं कर रहा है। वायर्सहार्क में मैं संचार देखता हूं। प्रिंटर या हवाई अड्डे मेरे आदेश प्राप्त करता है और एक एसीके पैकेज भेजता है।
जैसे ही मैं आईपैड सिम्युलेटर ऐप को मारता हूं, प्रिंटर को आईपैड का उपयोग करके भेजे गए आदेशों को प्रिंट करना शुरू कर देता है। ऐसा लगता है कि एक सॉकेट खोलने से सभी घटनाएं सामने आती हैं, मैं इसे कैसे होने से रोक सकता हूं?
अधिक यहाँ: https://devforums.apple.com/message/541436
जैसे ही मैं धाराओं को बंद करता हूं, didRemoveService आग लगती है। ऐसा लगता है कि किसी प्रकार का टाइमआउट इंतजार कर रहा है? – Zyphrax
मुझे यकीन नहीं है कि यह मामला है, लेकिन अपनी - (शून्य) स्ट्रीम पर नज़र डालें: (एनएसएसटीम *) एस्ट्रीम हैंडलएवेंट: (एनएसएसटी्रीमइवेंट) इवेंट हैंडलर। शेर में हैंडलर को NSStreamEventEndEncountered ईवेंट के लिए और भी नहीं कहा जाता है। इसलिए, आपको अपने इनपुट स्ट्रीम को बंद करने और लूप से इसे हटाने की आवश्यकता है जब आप सुनिश्चित करते हैं कि आपको सभी डेटा प्राप्त हुआ है। उदाहरण के लिए जब NSStreamEventHasBytes उपलब्ध होता है। – Davyd
ऐप्पल डेवलपर फ़ोरम तक पहुंच वाले लोगों के लिए। मैंने अपनी समस्या यहां पोस्ट की है: https://devforums.apple.com/message/541436। दुर्भाग्य से अभी भी कोई समाधान नहीं :( – Zyphrax