【问题标题】:ASIHTTPRequest code designASIHTTPRequest 代码设计
【发布时间】:2009-11-17 12:36:10
【问题描述】:

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

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

【问题讨论】:

    标签: iphone cocoa-touch design-patterns oop asihttprequest


    【解决方案1】:

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

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

    我所做的是子类ASIHTTPRequest 和:

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

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

    侦听NSNotification 允许我发出UIAlertView 对话框,让用户知道出了什么问题,或者在请求成功时处理请求响应数据(例如,将结果输入核心数据存储) HTTP 错误。

    无论请求成功还是失败,我都记得在完成后将请求发送到-release

    【讨论】:

    • 你必须在服务器端处理访问令牌吗?就我而言,我必须发出 3-4 个请求,我不确定它们是成功还是失败。如果它们失败了,我将不得不请求一个新的访问令牌,然后重新运行失败的请求。我也失败了,在我获得新令牌之前没有理由运行其他人。当它可用时,只需重新运行等待队列中的那些。
    【解决方案2】:

    我已经编写了一个单例类来处理这个问题。

    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];
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多