2013-05-07 73 views
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? 如果我不能或有更好/更清洁/更正确的方法来解决这个问题,我有什么选择?

+0

你有一个回调是什么,比代表意大利面代码更干净。 – newacct 2013-05-07 05:49:01

回答

1

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

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

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

+0

我认为你是正确的,如果这很重要....我会补充说,操作系统看起来是使用一种工厂模式(也许有java经验?不知道),它是完全有效的在这种情况下初始化委托在工厂...如果你可以找出一个干净的方式来取消它的所有权... – 2013-05-07 12:21:35

+0

@GradyPlayer我相信有一个设计模式! – matt 2013-05-07 17:24:01

1

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

相关问题