2009-12-25 19 views
11

मैं एक NSNetService एक आईपी के लिए इस कोड के साथ एक पृष्ठभूमि ऐप्लिकेशन में ("My_Mac" नाम) को हल करने की कोशिश कर रहा हूँ नहीं बुलाया जा रहा है:NSNetService प्रतिनिधियों

NSNetService *service = [[NSNetService alloc] initWithDomain:@"local." type:@"_daap._tcp" name:@"My_Mac"]; 
[service setDelegate:self]; 
[service resolveWithTimeout:5]; 

और एक ही कक्षा में, मैं इन राशि प्रतिनिधि तरीकों परिभाषित:

- (void)netServiceDidResolveAddress:(NSNetService *)sender 
- (void)netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict 

यहाँ अजीब हिस्सा है: जब तक कि मैं के बाद एक NSAlert चलाने न प्रतिनिधि पद्धतियों को बुलाया हो "[सेवा resolveWithTimeout: 5],"। कोई विचार?

उत्तर

9

मुझे यकीन नहीं है, लेकिन ऐसा लगता है कि अनुरोध किसी कारण से रन लूप में वास्तव में निर्धारित नहीं है। शायद इसे निर्धारित करने के लिए this जैसे कुछ कोशिश करें?

NSNetService *service = [[[NSNetService alloc] initWithDomain:@"local." type:@"_daap._tcp." name:@"My_Mac"] autorelease]; 
[service setDelegate:self]; 
[service scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:@"PrivateMyMacServiceMode"]; 
[service resolveWithTimeout:8.0]; 

बेवकूफ सवाल है, लेकिन आप स्पष्ट रूप से NSServiceDelegate प्रोटोकॉल को लागू कर रहे हैं या सिर्फ तरीकों है?

संपादित करें: मुझे एक और विचार था कि यह किसी प्रकार की दौड़ की स्थिति (एक अधिक संभावना परिदृश्य) हो सकती है। प्रतिनिधियों आमतौर पर कमजोर संदर्भ हैं। यदि आपकी वस्तु गुंजाइश से बाहर हो रही है और ऑटोरेलेज्ड हो रही है, तो सिस्टम एक नील हैंडल के साथ खत्म हो जाएगा और संदेशों को शून्य में फायर कर देगा। जिस मामले में आप एक एनएसएएलर्ट (या अन्य काम करते हैं) दिखाते हैं, तो आपका ऑब्जेक्ट उस समय तक पहुंचने के लिए पर्याप्त लंबे समय तक लटक रहा हो सकता है। क्या आप पूर्ण 8 सेकंड के लिए अपने ऑब्जेक्ट स्टिक की पुष्टि कर सकते हैं?

+0

उत्तर एसएलएफ के लिए धन्यवाद। मैंने आपके पास NSRunLoop कोड की कोशिश की, लेकिन कोई पासा नहीं। मेरे पास अभी भी विधियां हैं क्योंकि मैं 10.5 को लक्षित कर रहा हूं जिसमें औपचारिक NSServiceDelegate प्रोटोकॉल परिभाषित नहीं है। –

+2

एसएलएफ: आप सही हैं - मैंने यह सुनिश्चित करने के लिए जीसी बंद कर दिया कि ऑब्जेक्ट अभी भी वहां था, और प्रतिनिधियों को बुलाया गया था। अब मुझे यह पता लगाना होगा कि यह कहां से ऑटोरेलेज्ड किया जा रहा है, क्योंकि मैंने स्पष्ट रूप से इसे बनाए रखने की कोशिश की है, और यह काम नहीं करता है। मुझे सही दिशा बताने के लिए धन्यवाद! –

+0

प्रतीत होता है जटिल जटिल समस्याओं का समाधान आमतौर पर आपके विचार से आसान होता है :) – slf

23

यदि आप एआरसी का उपयोग कर रहे हैं तो आपको कहीं भी सेवा ऑब्जेक्ट को बनाए रखना होगा। आपके उदाहरण में, सेवा ऑब्जेक्ट अधिकतर दायरे से बाहर हो जाता है और आपके कोड में कहीं और संदर्भित नहीं किया जाता है, इसलिए संकलक संकल्प कॉल के तुरंत बाद इसे रिलीज़ करने का प्रयास करेगा।

एक संपत्ति जोड़ें:

@property (nonatomic, strong) NSMutableArray *services; 

आपका प्रतिनिधि में, या जहाँ भी आप NSNetService

का उपयोग
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser 
      didFindService:(NSNetService *)aNetService 
       moreComing:(BOOL)moreComing 
{ 
    if (!self.services) { 
     self.services = [[NSMutableArray alloc] init]; 
    } 
    [self.services addObject:aNetService]; 
    [aNetService setDelegate:self]; 
    [aNetService resolveWithTimeout:3.0]; 
} 

रोकने के लिए और उन सेवाओं को जारी करने के लिए मत भूलना एक बार आप समाप्त या से छुटकारा पाने रहे हैं प्रतिनिधि:

for (NSNetService* service in self.services) { 
    [service stop]; 
} 
[self.services removeAllObjects]; 
+0

यह मेरे लिए काम किया! – joshblour

+0

इसे बनाए रखने के काम करता है। लेकिन NSNetServiceDelegate विधि हस्ताक्षर में NSNetService पैरामीटर ऑब्जेक्ट को बनाए रखता है? जैसे ** प्रेषक ** '- (शून्य) netServiceDidResolveAddress: (NSNetService *) प्रेषक' – snowbound

संबंधित मुद्दे