【问题标题】:Asynchronous iOS networking library design [closed]异步 iOS 网络库设计 [关闭]
【发布时间】:2011-05-05 23:44:18
【问题描述】:

在开发 iPhone 应用程序库时,我面临着一个设计决策,希望得到反馈。基本上,我正在为 REST API 开发一个异步 HTTP 客户端库。

我的问题是: 将解析后的数据从库返回给调用代码的推荐方法是什么?

同步将简单地: NSArray *users = [restLibrary getAllUsers] 其中 getAllUsers 声明为: - (NSArray *)getAllUsers;

或用于自定义对象 用户 *tom = [restLibrary getUser:@"tom"] 如果 getUser: 声明为: - (User *)getUser:(NSString *)userName;

我对如何干净地异步执行此操作感到困惑。

我遇到了这个unanswered question 并提出了同样的问题。原发帖人找到了解决方案,但他/她不确定是否是推荐的。

感谢您的帮助。

豪尔赫

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    使用异步调用时,您会等待回调。这基本上意味着您要求一个类开始做某事,当它完成后,它应该执行您选择的方法。

    Apple 自己的 NSUrlConnection 类就是一个很好的例子。你为这个类提供了一个委托。这基本上是 NSUrlConnection 类将在适当时对其执行方法的对象。

    所以

    NSURLRequest *  req = [NSURLRequest requestWithURL: self.url];
    self.downloadConnection = [NSURLConnection connectionWithRequest: req
                                                            delegate: self];
    [self.downloadConnection start];
    

    这告诉 NSUrlConnection 类从 self.url 获取数据,并且它应该使用当前类作为委托。

    委托上有几个方法,在某些情况下调用,最常见的可能是

    - (void) connectionDidFinishLoading: (NSURLConnection *) connection
    {
    
    }
    

    对于你的班级,你会做类似的事情。您将首先定义一个@protocol 来表示您将使用的接口。在您的示例中,这可能具有类似

    的方法
    - (void)userFetched:(User *)user
    

    然后您使用类似于

    的方法执行您的restLibrary
    [restLibrary getUser:@"tom" delegate:self]
    

    并且调用类应该实现 userFetched 方法。

    在 restLibrary 上的 getUser 方法中,您将执行实际调用以获取数据(很可能异步使用 NSUrlConnection 并将返回的数据解析为 User 对象),然后使用结果调用 userFetched。

    您需要实现其他方法来处理错误情况等。

    这有帮助吗?

    【讨论】:

    • 是的!谢谢托马斯。我完全忽略了@protocol 定义。现在事情说得通了。再次感谢。
    【解决方案2】:

    除非您有自己的要求...我只会使用开源库 ASIHTTP。

    http://allseeing-i.com/ASIHTTPRequest/

    它非常坚固。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多