Просмотр для доменов
В зависимости от Вашего приложения Вы можете или, возможно, не должны просматривать для доменов. Необходимо рассмотреть просмотр для доменов если:
Вы хотите предоставить возможность для пользователя для управления, какие домены используются в просматривающих службу целях.
Вы хотите предоставить возможность для пользователя для управления, какие домены приложение использует при публикации его служб.
Вы пишете специализированному Добрый день браузер, и Вы хотите показать все возможные домены в своих просматривающих службу результатах, даже если те домены не возвращали результатов.
Необходимо получить полный список всех доменов, о которых знает компьютер, даже если им не включают по умолчанию.
Если Ваше приложение не удовлетворяет ни одного из тех критериев, Вы, вероятно, не должны просматривать для доменов. Однако, если Ваше приложение позволяет пользователю просмотреть для служб, необходимо все еще разработать пользовательский интерфейс таким способом, которым пользователь может различить многократные идентичные результаты, предоставленные различными доменами.
Эта глава объясняет, как обнаружить, какие домены доступны для использования в будущем просмотре или регистрационных действиях службы.
О доменном просмотре
NSNetServiceBrowser
класс обеспечивает методы для просмотра доступных доменов. Используйте эти методы, если Вы пишете приложение, которое должно опубликовать или просмотреть домены кроме доменов по умолчанию.
Поскольку доменный просмотр может занять время, NSNetServiceBrowser
объекты выполняют просмотр асинхронно путем регистрации в цикле выполнения. Просматривающие результаты возвращаются к Вашему приложению через методы делегата. Правильно использовать NSNetServiceBrowser
объект, необходимо присвоить его делегат.
Просмотр для доменов предпринимает три шага:
Инициализируйте
NSNetServiceBrowser
экземпляр, и присваивает делегата в объекте.Начните поиск доменов (или для регистрации или для просмотра).
Результаты поиска дескриптора и другие сообщения отправили к объекту делегата.
Следующие разделы описывают эти шаги подробно.
Инициализация браузера и запуск поиска
Инициализировать NSNetServiceBrowser
объект, используйте init
метод. Этот метод устанавливает браузер и добавляет его к текущему циклу выполнения. Если Вы хотите использовать цикл выполнения кроме текущего, используйте removeFromRunLoop:forMode:
и scheduleInRunLoop:forMode:
методы.
После инициализации объекта можно использовать его для поиска доменов, в которых можно зарегистрировать службы (с searchForRegistrationDomains
метод) или обзор для служб (с searchForBrowseDomains
метод).
Когда Вы закончите, вызовите stop
метод. Необходимо выполнить любую необходимую очистку в netServiceBrowserDidStopSearch:
обратный вызов делегата.
Перечисление b-1 демонстрирует, как просмотреть для регистрационных доменов с NSNetServiceBrowser
. Код инициализирует объект, присваивает делегата и начинает поиск доступных доменов.
Просмотр перечисления b-1 для регистрационных доменов
id delegateObject; // Assume this object exists. |
NSNetServiceBrowser *domainBrowser; |
domainBrowser = [[NSNetServiceBrowser alloc] init]; |
[domainBrowser setDelegate:delegateObject]; |
[domainBrowser searchForRegistrationDomains]; |
Реализация методов делегата для просмотра
NSNetServiceBrowser
возвраты весь просмотр заканчиваются его делегату. При использовании класса для просмотра для доменов, объект делегата должен реализовать следующие методы:
netServiceBrowserWillSearch:
netServiceBrowserDidStopSearch:
netServiceBrowser:didNotSearch:
netServiceBrowser:didFindDomain:moreComing:
netServiceBrowser:didRemoveDomain:moreComing:
netServiceBrowserWillSearch:
метод уведомляет делегата, что начинается поиск. Можно использовать этот метод для обновления пользовательского интерфейса, чтобы отразить, что поиск происходит. При просмотре остановок делегат получает a netServiceBrowserDidStopSearch:
сообщение. В том методе делегата можно выполнить любую необходимую очистку.
Если делегат получает a netServiceBrowser:didNotSearch:
сообщение, это означает, что поиск перестал работать по некоторым причинам. Необходимо извлечь информацию об ошибке из словаря с NSNetServicesErrorCode
ключ и обрабатывает ошибку соответственно. Посмотрите NSNetServicesError
для списка возможных ошибок.
Вы отслеживаете домены с двумя методами —netServiceBrowser:didFindDomain:moreComing:
и netServiceBrowser:didRemoveDomain:moreComing:
— которые указывают, что служба стала доступной или закрылась. moreComing
параметр указывает, является ли больше результатов на пути. Если этот параметр YES
, Вы не должны обновлять элементы пользовательского интерфейса, пока метод не вызывают с a moreComing
параметр NO
. Если Вы хотите список доступных доменов, необходимо поддержать собственный массив на основе информации, предоставленной методами делегата.
Перечисление b-2 показывает интерфейс для класса, отвечающего на NSNetServiceBrowser
методы делегата, требуемые для доменного просмотра и Перечисления b-3, показывают его реализацию. Можно использовать этот код в качестве начальной точки для кода просмотра домена.
Интерфейс перечисления b-2 для NSNetServiceBrowser
делегируйте объект, используемый при просмотре для доменов
#import <Foundation/Foundation.h> |
@interface NetServiceDomainBrowserDelegate : NSObject <NSNetServiceBrowserDelegate> |
{ |
// Keeps track of available domains |
NSMutableArray *domains; |
// Keeps track of search status |
BOOL searching; |
} |
// NSNetServiceBrowser delegate methods for domain browsing |
- (void)netServiceBrowserWillSearch:(NSNetServiceBrowser *)browser; |
- (void)netServiceBrowserDidStopSearch:(NSNetServiceBrowser *)browser; |
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser |
didNotSearch:(NSDictionary *)errorDict; |
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser |
didFindDomain:(NSString *)domainString |
moreComing:(BOOL)moreComing; |
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser |
didRemoveDomain:(NSString *)domainString |
moreComing:(BOOL)moreComing; |
// Other methods |
- (void)handleError:(NSNumber *)error; |
- (void)updateUI; |
@end |
Реализация перечисления b-3 для NSNetServiceBrowser
делегируйте объект, используемый при просмотре для доменов
#import "NetServiceDomainBrowserDelegate.h" |
@implementation NetServiceDomainBrowserDelegate |
- (id)init |
{ |
self = [super init]; |
if (self) { |
domains = [[NSMutableArray alloc] init]; |
searching = NO; |
} |
return self; |
} |
// Sent when browsing begins |
- (void)netServiceBrowserWillSearch:(NSNetServiceBrowser *)browser |
{ |
searching = YES; |
[self updateUI]; |
} |
// Sent when browsing stops |
- (void)netServiceBrowserDidStopSearch:(NSNetServiceBrowser *)browser |
{ |
searching = NO; |
[self updateUI]; |
} |
// Sent if browsing fails |
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser |
didNotSearch:(NSDictionary *)errorDict |
{ |
searching = NO; |
[self handleError:[errorDict objectForKey:NSNetServicesErrorCode]]; |
} |
// Sent when a domain appears |
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser |
didFindDomain:(NSString *)domainString |
moreComing:(BOOL)moreComing |
{ |
[domains addObject:domainString]; |
if(!moreComing) |
{ |
[self updateUI]; |
} |
} |
// Sent when a domain disappears |
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser |
didRemoveDomain:(NSString *)domainString |
moreComing:(BOOL)moreComing |
{ |
[domains removeObject:domainString]; |
if(!moreComing) |
{ |
[self updateUI]; |
} |
} |
// Error handling code |
- (void)handleError:(NSNumber *)error |
{ |
NSLog(@"An error occurred. Error code = %@", error); |
// Handle error here |
} |
// UI update code |
- (void)updateUI |
{ |
if(searching) |
{ |
// Update the user interface to indicate searching |
// Also update any UI that lists available domains |
} |
else |
{ |
// Update the user interface to indicate not searching |
} |
} |
@end |