使用自定义Response类将运行时信息添加到CocoaHTTPServer

时间:2011-12-13 15:45:57

标签: objective-c cocoa http cocoaasyncsocket

我有以下代码来启动我自己的Cocoa HTTP Server。为了手动处理响应,我创建了名为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 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。为了解决这个问题,我更改了HTTPServer类的代码,以便您可以设置delegate,然后在创建的每个HTTPConnection上设置HTTPConnection。当{{1}}必须处理请求时,我会调用该委托。这远非干净,我正在寻求更好的解决方案。

答案 1 :(得分:0)

您可以通过向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