【问题标题】:Add run-time information to CocoaHTTPServer using custom Response class使用自定义 Response 类将运行时信息添加到 CocoaHTTPServer
【发布时间】:2011-12-13 15:45:57
【问题描述】:

我有以下代码来启动我自己的Cocoa HTTP Server。为了手动处理响应,我创建了名为 PictureHTTPConnection 的自定义 HTTPConnection 类

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

这里的问题是PictureHTTPConnection 类需要一些信息来处理HTTP 连接。但是,我只提供类,因此我没有对实例的引用。我可以用全局数据做一些事情,但这不是很好的编程实践。

我能想到的最好方法是将PictureHTTPConnection 的委托设置为UIApplicationDelegate,以便它可以响应任何回调。 :-(

【问题讨论】:

  • 我为此开了一个issue

标签: objective-c cocoa http cocoaasyncsocket


【解决方案1】:

我遇到了同样的问题。为了解决这个问题,我更改了HTTPServer 类的代码,以便您可以将其设置为delegate,然后在创建的每个HTTPConnection 上设置它。当HTTPConnection 必须处理请求时,我会打电话给代表。这也远非干净,我正在寻找更好的解决方案。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-11
      • 2017-09-28
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 2019-09-16
      相关资源
      最近更新 更多