2011-05-05 45 views
3

我在开发一个iPhone应用程序库的同时正在面临设计决策,对此我很感激反馈。基本上,我正在为REST API开发一个异步HTTP客户端库。异步iOS网络库设计

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

同步方式将简单地: 的NSArray *用户= [restLibrary getAllUsers] 其中getAllUsers被声明为: - (NSArray的*)getAllUsers;

或对于自定义对象 用户*汤姆= [restLibrary的getUser:@ “汤姆”] 如果的getUser:被声明为: - (用户*)的getUser:(的NSString *)用户名;

我很困惑如何干净地异步做到这一点。

我碰到这个unanswered question具有相同的确切问题。原始海报发现了一个解决方案,但他/她不确定是否是推荐的解决方案。

感谢您的帮助。

Jorge

回答

9

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

一个很好的例子是苹果自己的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和结果。

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

这有帮助吗?

+0

是的!,谢谢。我完全忽略了@protocol定义。事情现在有道理。再次感谢。 – jlmendezbonini 2011-05-05 16:59:07