2009-11-17 47 views
3

我正在使用ASIHTTPRequest与服务器异步通信。它工作得很好,但我在不同的控制器中执行请求,现在重复的方法在所有这些控制器中。在单个类中抽象代码(请求)的最佳方式是什么,因此我可以轻松地重新使用代码,这样我就可以使控制器更简单。我可以把它放在单身人士(或在应用程序委托),但我不认为这是一个好方法。或者可以使用委托回调为其创建自己的协议。ASIHTTPRequest代码设计

一个良好的设计方法,任何意见将是有益的。谢谢。

回答

7

我使用的奔科普塞的ASIHTTPRequest非常沉重的Web服务客户端,我希望在接下来的几个星期才能完成的子类。这是一个伟大的项目,他的工作为我节省了大量的时间和精力。

我有一个ASINetworkQueue在应用程序委托成立。队列发送-go消息,以便它可以接收请求。我将我的子类请求添加到此队列中。每个请求都会被处理并发布其通知,并且我的视图控制器会相应地处理响应数据。

我所做的是子类ASIHTTPRequest和:

  1. 搭建-init方法(或-initWithParams:方法,根据请求)
  2. 覆盖-requestFailed:-requestCompleted:处理来自回来HTTP错误信息web服务
  3. 我的视图控制器注册以观察来自-requestCompleted:方法中的错误处理的NSNotification通知

作为视图控制器被推上并弹出导航堆栈,我添加和删除不同的注册。一些视图控制器只需要侦听特定的子类请求类型。

收听NSNotification允许我发出UIAlertView对话框,让用户知道出了什么问题,或者在请求产生成功的HTTP错误时处理请求响应数据(例如将结果馈送到Core Data存储区)。

请求是否成功或失败,我记得-release请求时,我用它做。

+0

您是否必须处理服务器端的访问令牌?在我的情况下,我必须发出3-4个请求,我不确定他们是否会成功或失败。如果它们失败了,我将不得不要求一个新的访问令牌,然后重新运行失败的请求。另外我失败了,没有理由去运行其他人,直到我得到新的令牌。如果可用,只需重新运行等待队列中的那些。 – Zsolt

0

我写了一个单独的类来处理这个问题。

static TCHttpRequest *_sharedHttpRequest = nil; 
+ (id)sharedRequest 
{ 
    @synchronized(self){ 
     if (_sharedHttpRequest == nil) { 
      _sharedHttpRequest = [[self alloc] init]; 
     } 
    } 
    return _sharedHttpRequest; 
} 


- (NSDictionary *)loginWithUserName:(NSString *)user password:(NSString *)pwd 
{ 
    NSURL *url = [NSURL URLWithString:@"/login" relativeToURL:_url]; 

    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
    [request setCachePolicy:ASICacheForSessionDurationCacheStoragePolicy]; 
    [request setTimeOutSeconds:HTTP_REQ_TIMEOUT]; 
    [request addPostValue:user forKey:@"username"]; 
    [request addPostValue:pwd forKey:@"password"]; 
    request.delegate = self.delegate; 
    [_common_queue addOperation:request]; 
} 
0

我看不出类方法和实例方法是如何相关的?类方法实例化TCHttpRequest并保证只有一个实例。 loginWithUserName实例方法实例化一个ASIFormDataRequest并将其添加到通用队列。我在这里看不到任何重用?