从networking上的数据抓取类返回数据?

我试图创build一个类,让我从一个Web服务获取请求的数据。 我被困在如何返回值。

// FooClass.m // DataGrabber is the class which is supposed to get values dataGrabber = [[DataGrabber alloc] init]; xmlString = [dataGrabber getData:[NSDictionary dictionaryWithObjectsAndKeys:@"news", @"instruction", @"sport", @"section", nil]]; 

在这个例子中,它应该得到体育新闻。 问题是DataGrabberasynchronous获取数据,并最终从几个NSURLConnection委托方法跳转。 在收到数据时如何知道FooClass?

与严格的协议一起使用的委托模式对此非常有用(这是DataGrabber在NSURLConnection完成时会发现的,对吗?)。 我已经写了一些Web APIs,这样就消耗了XML和JSON信息。

 // In my view controller - (void) viewDidLoad { [super viewDidLoad]; DataGrabber *dataGrabber = [[DataGrabber alloc] init]; dataGrabber.delegate = self; [dataGrabber getData:[NSDictionary dictionaryWithObjectsAndKeys:@"news", @"instruction", @"sport", @"section", nil]]; } 

然后在你的DataGrabber.h文件中:

 @protocol DataGrabberDelegate @required - (void) dataGrabberFinished:(DataGrabber*)dataGrabber; - (void) dataGrabber:(DataGrabber*)dataGrabber failedWithError:(NSError*)error; @end 

而在DataGrabber.m中:

 - (void) getData:(NSDictionary*)dict { // ... Some code to process "dict" here and create an NSURLRequest ... NSURLConnection *connection = [NSURLConnection connectionWithRequest:req delegate:self]; } - (void) connectionDidFinishLoading:(NSURLConnection*)connection { // ... Do any processing with the returned data ... // Tell our view controller we are done [self.delegate dataGrabberFinished:self]; } 

然后确保Foo实现了DataGrabberDelegate协议方法来处理每个事件。

最后,你的DataGrabber有一个delegate属性(确保你使用了assign,而不是retain来避免保留周期):

 @property (nonatomic, assign) id<DataGrabberDelegate> delegate; 

当NSURLConnectionasynchronous加载在DataGrabber内部完成时,它们将以上面列出的协议callback到您的UIViewController,以便您可以更新UI。 如果是一个请求,理论上你可以摆脱DataGrabber,并把它放在你的视图控制器,但我喜欢“分开我的顾虑” – API和视图控制器保持分开。 它会生成一个额外的层,但是它将“文本处理代码”保留在视图控制器之外(专门用于JSON和XMLparsing代码)。

我已经多次成功地完成了这一步 – 另一个关键是最好给用户提供一些正在加载页面的反馈 – 打开状态栏中的活动指示器,向他们展示一个UIActivityIndi​​cator等,然后当你的委托callback成功或失败,你摆脱它。

最后,我写了一篇更详细的博客文章: 在iPhone上使用Web API

你可以为你的DataGrabber类实现通知,每当你收到一定数量的数据(或者如果你想要下载的时候),然后通知的方法(阅读文档中的通知)可以做任何处理想。

注意:如果FooClassDataGrabber的委托,那将会很有帮助

我也使用这个通知。 这是一个很好的详细解释如何设置。