0

我正在构建作为 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?如果我不能或有更好/更清洁/更正确的方法来解决这个问题,我有什么选择?

4

2 回答 2

1

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

于 2013-05-07T19:33:49.833 回答
1

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

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

好的,这是否有帮助,或者我只是花了两段时间谈论与您的问题完全无关的事情?

于 2013-05-07T02:27:22.507 回答