Запуск глобального сокета (AsyncSocket)

Я пытаюсь запустить сокет из другого класса (не в «applicationDidFinishLaunching»), поэтому в AppDelegate.m я вызываю класс netClass:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    netClass *network = [[netClass alloc] init];
    [network startNet];
}

А в netClass метод startNet запускает сокет обычным образом:

- (void)startNet 
{
    [DDLog addLogger:[DDTTYLogger sharedInstance]];
    ...
    [netService publish];
}

Но методы asyncSocket в netClass, такие как didAcceptNewSocket, socketDidDisconnect, netServiceDidPublish, не вызываются.

Есть идеи, как это назвать?

Любая помощь будет оценена по достоинству :-)


person Community    schedule 20.05.2012    source источник
comment
Что такое netClass? Вероятно, вы не устанавливаете делегата.   -  person Stephen Furlani    schedule 21.05.2012
comment
netClass - это еще один класс, который я создал для запуска подключения и работы с методами делегата. В файле .h я установил делегата, например NSObject <NSApplicationDelegate, NSNetServiceDelegate, GCDAsyncSocketDelegate>, но он не работает. Есть идеи, Стивен?   -  person    schedule 21.05.2012
comment
@Alberto: Это не настройка делегата; который объявляет, что экземпляры этого класса могут быть такими типами делегатов. Объявление того, что любой экземпляр может быть делегатом определенных типов объектов, не делает конкретный экземпляр фактически делегатом определенного другого объекта.   -  person Peter Hosey    schedule 22.05.2012
comment
@PeterHosey, извините, я тоже добавил [netService setDelegate:self];, но он не работает! Невероятно странно!   -  person    schedule 22.05.2012


Ответы (1)


Вам нужно установить делегата, отправив сообщение setDelegate: тому, что ваш объект NSNetService - это похоже на код, который вы опубликовали, что это "netService" ([netService setDelegate:self];).

Ввод «NSApplicationDelegate, NSNetServiceDelegate, GCDAsyncSocketDelegate» в ваш .h файл не устанавливает делегата, это просто дает компилятору знать, что вы намереваетесь реализовать методы этих протоколов. Кроме того, там не должно быть NSApplicationDelegate, поскольку у вас уже есть делегат приложения.

person rdelmar    schedule 21.05.2012
comment
Вот почему это забавно: в AppDelegate мне не нужно его устанавливать ([netService setDelegate:self];, и он работает нормально, вызывая методы делегата, а в моем классе (netClass), даже помещая setDelegate, он не работает! PS: NSApplicationDelegate удаленный. :-) - person ; 22.05.2012
comment
@Alberto: NSNetService не может «вызывать методы делегата» чего-то, что не является его делегатом. Если вы имеете в виду методы NSApplicationDelegate, они не связаны: NSApplication отправляет сообщения, перечисленные в протоколе NSApplicationDelegate, своему делегату, а NSNetService отправляет сообщения, перечисленные в протоколе NSNetServiceDelegate, своему делегату. Убедитесь, что ваш экземпляр «netClass» (которому действительно нужно другое имя) действительно создал NSNetService. - person Peter Hosey; 22.05.2012
comment
На самом деле он называется JSNetwork, netClass, чтобы упростить задачу. :-D. Я был неправ: в AppDelegate applicationDidFini[...] я вызываю [netService setDelegate:self];, но вызов из netClass не работает. Это действительно странно: один и тот же код, одинаковые делегаты, одинаковые методы, разные действия. Поищу получше в инете. Если я найду что-нибудь действительно актуальное, я опубликую это здесь. Спасибо, @PeterHosey. - person ; 22.05.2012
comment
@Alberto: В какой класс вы помещаете методы NSNetServiceDelegate? - person rdelmar; 22.05.2012
comment
Трудно сказать, что делать сейчас, не увидев большего количества кода в вашем классе JSNetwork. Вы извлекли [netService setDelegate: self] из делегата приложения? Вы не можете иметь 2 объекта как делегат чего-либо, это должно быть только в классе JSNetwork. Я не уверен, следует ли отправлять это сообщение setDelegate в netService, поскольку вы не показали код для этого класса. - person rdelmar; 22.05.2012