0

在 Xcode 项目中,我有 2 个类ParentViewController,另一个类ChildViewControllerParentViewController. 在ParentViewController课堂上,我们使用NSURLConnection,didReceiveDataconnectionDidFinishLoading从后端服务器获取一些数据。它工作得很好。现在ChildViewController我需要建立连接并从后端获取数据。但是如果我添加didReceiveDataand connectionDidFinishLoadingin ChildViewController,那么didReceiveDatainParentViewController似乎不再起作用了。我想知道为什么?

似乎我有很多不同的请求发送到后端,所以我的didReceiveDataconnectionDidFinishLoading被声明压倒了(connect == someConnection)。我想知道处理这种情况的任何巧妙方法?谢谢。

4

3 回答 3

0

您的问题是您试图在视图控制器中获取数据,这不是您应该获取数据的地方。

将所有数据提取移动到模型对象。当视图控制器需要某些东西时,他们可以请求模型加载它。然后,即使视图控制器离开屏幕,模型仍然可以正确更新并让视图控制器知道何时完成。

通常,每个连接都可以有一个模型对象。例如,如果我正在从服务器数据库更新个人记录,那么 Person 对象将请求其自己的数据。然后它的 connectionDidFinishLoading 只需要处理那个连接。

您仍然可能希望通过中央队列(NSOperationQueue例如)放置您的连接,这样您就可以避免请求使您的网络连接不堪重负。但是每个连接的委托将是相关的模型对象,而不是视图控制器。

于 2012-04-10T04:41:14.733 回答
0

ObjectiveC 中的网络代码会很快变得不堪重负。我建议使用库来简化流程。结帐https://github.com/AFNetworking/AFNetworking

于 2012-04-10T04:53:26.233 回答
0

子类将继承 ParentViewController 的连接委托方法。如果您希望在子类中具有相同的行为,请不要在那里实现委托方法。

另一个想法是完全避免使用委托方法。在 iOS5 中,NSURLConnection 提供了一种更好的方法来使用完成块来启动连接,因此您的每个连接的代码都可以位于上下文中,如下所示:

NSURLRequest *requestA = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http..."]];
[NSURLConnection sendAsynchronousRequest:requestA queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    // do what you need to do when requestA completes
}];

NSURLRequest *requestB = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http..."]];
[NSURLConnection sendAsynchronousRequest:requestA queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    // do what you need to do when requestB completes
}];

如果应用程序正在执行大量远程请求,我同意您可能想要重新考虑设计的其他答案。

于 2012-04-10T04:56:22.513 回答