2011-12-12 66 views
3

我希望做這樣的事情,當不同NetService:NetServiceBrowser給刪除了

netServiceBrowser:didFindService:moreComing:

[self.foundServices addObject:aNetService]; 

而且在netServiceBrowser:didRemoveService:moreComing:

[self.foundServices removeObject:aNetService]; 

然而,返回的服務不由NetServiceBrowser保留,因此didRemoveService中給出的服務與陣列中的服務不同。我如何比較服務以確保我刪除的服務是正確的?

+0

不知道爲什麼有人低估了這一點,這是一個完全合理的問題。如果可以的話,我會再次高舉! –

+0

可能是因爲這個問題產生了不正確的斷言。 –

回答

5

你在思考這個問題,並在你的腦海中創建一個不存在的問題。對傳遞到didRemoveService:的對象使用removeObject:removeObject:基於對象對isEqual:的響應進行刪除,而不是對象的地址或標識。所以這隻會工作。

答案真的很簡單,只要:

[self.foundServices removeObject:aNetService]; 

蘋果的removeObject:說明解釋這一點:

此方法使用indexOfObject:找到匹配,然後通過使用removeObjectAtIndex:刪除它們。因此,根據對象對消息的響應來確定匹配。

(爲了完整起見,蘋果確實提供的功能,通過地址刪除的對象是removeObjectIdenticalTo:這不是你想在這裏的行爲,但是隻要使用removeObject:。)

參考文獻:

+0

近2年前,這個問題被問到了,我沒有訪問原始代碼。上面描述的DID問題發生了,我猜這是因爲可能是預發佈的代碼,或者代碼中發生了一些奇怪的事情。我的答案最終確實奏效,但我認爲我的具體問題不再發生。 – Zeophlite

+0

這個答案也差不多兩年前,我從2010年開始爲iOS開發。包括,是的,NSNetService的工作。我不懷疑你以爲你看到了什麼,但是你的假設是錯誤的。這一直工作。事實上,你可以看到我發佈了這個答案**在同一天**發佈你的。 –

+0

而且要完全清楚:我完全同情,因爲當時我以爲'removeObject:'不會做我想要的。然後我測試了它,發現它確實*我需要它做。 –

0

簡短的回答,我結束了不得不使用這個,但我不能再現問題了。使用選定的答案。

- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing { 
    [self.foundServices addObject:aNetService]; 
} 


- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didRemoveService:(NSNetService *)aNetService moreComing:(BOOL)moreComing { 
    NSNetService *found = nil; 

    for(NSNetService *ns in self.foundServices) { 
     if([ns isEqualTo:aNetService]) { 
      found = ns; 
     } 
    } 

    if(found) { 
     [self.foundServices removeObject:found]; 
    } 
} 
+0

這是不必要的;你只是重建一個稍微不正確的'removeObject:'版本。 –