首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步iOS网络库设计

异步iOS网络库设计
EN

Stack Overflow用户
提问于 2011-05-05 15:31:23
回答 2查看 2.2K关注 0票数 3

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

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

同步只需: NSArray *user= restLibrary getAllUsers,其中getAllUsers声明为:- (NSArray *)getAllUsers;

或者对于自定义对象User *tom = restLibrary getUser:@"tom“,如果getUser:声明为:- (User *)getUser:(NSString *)userName;

我对如何异步地干净地完成它感到困惑。

我碰到这个unanswered question时也有同样的问题。最初的海报找到了一个解决方案,但他/她不确定是否是推荐的解决方案。

谢谢你的帮助。

豪尔赫

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-05 15:40:16

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

这方面的一个很好的例子是苹果自己的NSUrlConnection类。您为该类提供了一个委托。这基本上是一个对象,NSUrlConnection类将酌情对其执行方法。

所以

代码语言:javascript
复制
NSURLRequest *  req = [NSURLRequest requestWithURL: self.url];
self.downloadConnection = [NSURLConnection connectionWithRequest: req
                                                        delegate: self];
[self.downloadConnection start];

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

关于委托有几种方法,在某些情况下调用,其中最常见的方法可能是

代码语言:javascript
复制
- (void) connectionDidFinishLoading: (NSURLConnection *) connection
{

}

在你的班上,你也会做类似的事情。首先定义一个@协议来表示要使用的接口。在您的示例中,这可能有一种方法,如

代码语言:javascript
复制
- (void)userFetched:(User *)user

然后使用类似于

代码语言:javascript
复制
[restLibrary getUser:@"tom" delegate:self]

调用类应该实现userFetched方法。

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

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

这个有用吗?

票数 9
EN

Stack Overflow用户

发布于 2011-05-05 15:44:18

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

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

它非常坚固。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5900359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档