3

我正在使用 ASIHTTPRequest 与服务器进行异步通信。它工作得很好,但我在不同的控制器中做请求,现在所有这些控制器中都有重复的方法。在单个类中抽象该代码(请求)的最佳方法是什么,以便我可以轻松地重用代码,从而使控制器更简单。我可以把它放在一个单例中(或在应用程序委托中),但我认为这不是一个好方法。或者也许用委托回调为它制定我自己的协议。

任何关于良好设计方法的建议都会有所帮助。谢谢。

4

3 回答 3

7

我正在ASIHTTPRequest大量使用 Ben Copsey 的子类作为 Web 服务客户端,我希望在接下来的几周内完成。这是一个很棒的项目,他的工作为我节省了大量时间和精力。

ASINetworkQueue在应用程序委托中进行了设置。向队列发送-go消息,以便它准备好接收请求。我将我的子类请求添加到此队列中。每个请求都被处理并发出通知,我的视图控制器相应地处理响应数据。

我所做的是子类ASIHTTPRequest和:

  1. 设置-init方法(或-initWithParams:方法,取决于请求)
  2. 覆盖-requestFailed:-requestCompleted:处理从 Web 服务返回的 HTTP 错误消息
  3. 我的视图控制器注册以观察NSNotification来自-requestCompleted:方法中的错误处理的通知

当视图控制器被推送并从导航堆栈中弹出时,我添加和删除不同的注册。一些视图控制器只需要监听某些子类请求类型。

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

无论请求成功还是失败,我都会-release在完成请求时记住它。

于 2009-11-17T12:50:52.983 回答
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];
}
于 2011-07-14T02:59:19.207 回答
0

我看不出类方法和实例方法有什么关系?类方法实例化 TCHttpRequest 并保证只有一个实例。loginWithUserName 实例方法实例化 ASIFormDataRequest 并将其添加到公共队列中。我在这里看不到任何重用?

于 2012-03-02T18:08:47.790 回答