Добавить информацию времени выполнения в CocoaHTTPServer, используя пользовательский класс Response - PullRequest
1 голос
/ 13 декабря 2011

У меня есть следующий код для запуска моего собственного Какао HTTP-сервера .Чтобы вручную обработать ответы, я создал свой пользовательский класс HTTPConnection с именем PictureHTTPConnection

self.httpServer = [[HTTPServer alloc]init];
self.httpServer.type = @"_http._tcp.";
self.httpServer.name = @"MyBonjour Name";
self.httpServer.connectionClass = [PictureHTTPConnection class];

. Проблема в том, что классу PictureHTTPConnection требуется некоторая информация для обработки HTTP-соединений.Однако я предоставляю только класс и, следовательно, у меня нет ссылки на экземпляр.Я мог бы что-то сделать с глобальными данными, но это не очень хорошая практика программирования.

Лучший способ, о котором я могу думать, - это установить делегат PictureHTTPConnection на UIApplicationDelegate, чтобы он мог отвечать на любые обратные вызовы,: - (

Ответы [ 2 ]

1 голос
/ 26 января 2012

У меня была точно такая же проблема. Чтобы решить эту проблему, я изменил код класса HTTPServer, чтобы вы могли установить для него значение delegate, которое, в свою очередь, будет устанавливаться для каждого созданного HTTPConnection. Когда HTTPConnection должен обработать запрос, я вызываю делегата. Это тоже далеко не чисто, и я искал лучшее решение.

0 голосов
/ 09 марта 2015

Вы можете получить обратные вызовы, добавив категорию к HTTPServer, которая получает и устанавливает делегата. objc_setAssociatedObject ваш друг здесь:

@interface HTTPServer (WithDelegate)
    @property (strong, nonatomic) id delegate;
@end

@implementation HTTPServer (WithDelegate)
    NSString const *key = @"HttpServer.WithDelegate.key";
    - (void)setDelegate:(id)delegate
    {
        objc_setAssociatedObject(self, &key, delegate, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    - (id)delegate
    {
        return objc_getAssociatedObject(self, &key);
    }
@end

Установите делегат при инициализации экземпляра HTTPServer (или всякий раз, когда). Вызовите методы из вашей пользовательской реализации HTTPConnection, например:

[config.server.delegate handleRequest:theRequest];

Вы должны реализовать handleRequest:(Whatever*)theRequest в своем классе делегата

...