Просмотр для доменов

В зависимости от Вашего приложения Вы можете или, возможно, не должны просматривать для доменов. Необходимо рассмотреть просмотр для доменов если:

Если Ваше приложение не удовлетворяет ни одного из тех критериев, Вы, вероятно, не должны просматривать для доменов. Однако, если Ваше приложение позволяет пользователю просмотреть для служб, необходимо все еще разработать пользовательский интерфейс таким способом, которым пользователь может различить многократные идентичные результаты, предоставленные различными доменами.

Эта глава объясняет, как обнаружить, какие домены доступны для использования в будущем просмотре или регистрационных действиях службы.

О доменном просмотре

NSNetServiceBrowser класс обеспечивает методы для просмотра доступных доменов. Используйте эти методы, если Вы пишете приложение, которое должно опубликовать или просмотреть домены кроме доменов по умолчанию.

Поскольку доменный просмотр может занять время, NSNetServiceBrowser объекты выполняют просмотр асинхронно путем регистрации в цикле выполнения. Просматривающие результаты возвращаются к Вашему приложению через методы делегата. Правильно использовать NSNetServiceBrowser объект, необходимо присвоить его делегат.

Просмотр для доменов предпринимает три шага:

  1. Инициализируйте NSNetServiceBrowser экземпляр, и присваивает делегата в объекте.

  2. Начните поиск доменов (или для регистрации или для просмотра).

  3. Результаты поиска дескриптора и другие сообщения отправили к объекту делегата.

Следующие разделы описывают эти шаги подробно.

Инициализация браузера и запуск поиска

Инициализировать 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: метод уведомляет делегата, что начинается поиск. Можно использовать этот метод для обновления пользовательского интерфейса, чтобы отразить, что поиск происходит. При просмотре остановок делегат получает 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