是否可以/正确的类(不是实例)充当代表?

时间:2013-05-07 02:03:57

标签: ios objective-c delegates protocols static-methods

我正在构建用作REST服务器客户端的iOS应用程序。到目前为止,我一直在以非常简单的方式处理我的所有请求。每当我需要拨打电话时,我都会这样做:

[ApiRequestManager sendApiCall:@"dogs/getSomeDog"
                    withParams:@{ @"dog_name": @"freddo" }
                      callback:^(NSDictionary *result) {
                          // do something with the response data already unserialized
                          // (comes as JSON) by the ApiRequestManager static method.
                      }];

随着应用程序越来越复杂,我意识到如果我实际上已经将NSMutableURLRequest子类化并制定了我自己的响应协议,那么它将更加清晰(并且不需要进行测试),如下所示:

@protocol ApiRequestDelegate <NSObject>

- (void)apiRequest:(ApiRequest *)request didSucceedWithResult:(NSDictionary *)result;

@optional
- (void)apiRequest:(ApiRequest *)request didFailWithError:(NSError *)error;

@end

这允许我分离用于构建请求和处理其响应的代码等。当我开始使用委托模式替换旧的呼叫时,一切都很好,但是!然后我意识到,在这里和那里,我正在做这样的事情:

// in class Dog
+ (void)putLeashOnDogs:(NSArray *)dogs {
    NSString *ids = // collect IDs from dogs

    [ApiRequestManager sendApiCall:@"dogs/putLeash"
                        withParams:@{ @"dog_ids": ids }
                          callback:^(NSDictionary *result) {
                              // something
                          }];
}

我的问题是,我可以以某种方式说“这个类是有一个静态版本的X协议方法”然后,在我创建委托对象的静态方法(即ApiRequest实例)中只是说myRequest.delegate = self? 如果我不能或者有更好/更清洁/更正确的方法来解决这个问题,我有什么选择?

2 个答案:

答案 0 :(得分:1)

我可能错了,但听起来你遇到的问题类似于使用NSURLConnection进行多个同时下载的问题 - 即,对于每个这样的NSURLConnection,我们需要一个单独的委托来接收结果。如果是这样,我认为简单的解决方案不是在类级别统一,而是恰恰相反,以体现需​​要作为单独对象分离的所有内容。

我有一个MyDownloader类,它具有connection属性以及所有委托方法。要使用它,我们实例化它,初始化connection属性,并告诉它开始。每个MyDownload都负责自己的NSURLConnection,并且是该连接的委托。我们现在已经有效地将问题提升到了一个水平:我们现在正在将多个MyDownloader实例中的猫放在一起,而不是放弃多个NSURLConnections的猫,每个实例必须至少保留它们,直到下载完成为止。但这是一个容易的问题;例如,极简主义解决方案是将它们存储在NSMutableSet中。

好的,那是任何帮助还是只是花了两段时间谈论与你的问题完全无关的事情?

答案 1 :(得分:1)

回答原始语言问题:类对象可以将委托方法实现为类方法,但是没有办法声明类对象本身符合委托协议的实例方法。可以使用类型转换来安抚编译器,但是在运行时检查委托对象的协议的任何委托API都将无法正常工作。