0

我在确定正确的应用程序设计模式用于最初提醒用户他们需要启用 Internet 连接时遇到了一些问题。

由于用户可以请求的数据范围广泛,我有一个需要互联网连接的 iOS 应用程序。该应用程序有几个标签栏控制器,其中有导航控制器,可根据层次结构和返回的数据引导用户浏览各种视图。所有请求都是使用 ASIHTTPRequest 异步发出的,使用 NSNotificationCenter 观察者等待中央 api 请求类完成请求或报告错误。在大多数情况下,用户至少会下载第一个请求,但我总是可以要求他们在 UIAlertView 中启用他们的连接,然后通过从堆栈中弹出其他导航控制器级别(如果不是)将它们返回到较低级别连接的。总体而言,该应用程序运行良好。

但是,如果用户要在禁用连接的情况下首先打开应用程序,我就会遇到问题。通常,在我可能测试连接是否存在之前,我的初始子视图(它们是便于创建选项卡栏/导航层次结构的 IBoutlets)会尝试加载。我不确定是否正确的方法是在我的应用程序委托中创建一个超时,然后再以某种方式加载其他内容,或者发出一个实际上不检索任何关键数据的初始测试请求(因为这似乎几乎是不可能的,或者至少从头开始完全重新初始化视图而不是它的代表是不切实际的)。

有没有人在应用程序初始化阶段使用任何简单的方法来完成此任务?我觉得我一定遗漏了一些明显的东西,因为其余的部分都非常简单。

如果有人想让我发布代码,我可以,但是我很确定这主要是一个架构问题。另外请记住,由于我的应用程序有意松散耦合的性质,我宁愿在大多数情况下使用委托的观察者。

我非常感谢您对此的任何意见。

4

3 回答 3

1

正如您所建议的,这听起来像是一个架构问题。

我认为超时解决方案充其量是不确定的,因为整个加载过程是不确定的。我不知道您正在使用异步加载的数据填充哪些视图;但让我们说这是UITableView为了讨论。当视图第一次加载时,不会有数据;但如果连接可用,您将通过ASIHTTPRequest回调异步填充表。

一个例子:

[[CCFConnectionManager sharedManager] countScenariosForScenarioID:lwScenario.uniqueID
                                                                groupCode:groupCode
                                                        completionHandler:^(NSInteger count) {
                                                            lwScenario.completionCount = count;
                                                            dispatch_async(dispatch_get_main_queue(), ^{
                                                                [[self tableView] reloadData];
                                                            });

所以在完成处理程序中,我更新模型并发送[[self tableView] reloadData]. 后者在主线程上。HTH。

于 2011-10-11T10:45:38.857 回答
0
-(BOOL)isConnected{
BOOL connected;
const char *host = "www.google.com";
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host);
SCNetworkReachabilityFlags flags;
connected = SCNetworkReachabilityGetFlags(reachability, &flags);
BOOL isConnected = connected && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
CFRelease(reachability);
return isConnected;}

此方法添加在应用程序委托中。

于 2011-10-12T09:56:55.623 回答
0

我最终使用了更多通知来做到这一点:

我用“测试请求”从我的应用委托调用我的 api 请求类,然后​​也在应用委托中监听它。如果应用程序委托观察到一个成功的响应,它会启动另一个请求,我的活动视图控制器是观察者。传递的对象包含接收控制器重新加载其视图所需的数据。

我认为下次我需要更好地计划我的代表团以取消一些通知。但是,对于像这样动态使用同一个类并且可以接收多组数据或者数据可以用于不同上下文的应用程序,我认为通知确实有意义。

于 2011-10-12T09:30:37.360 回答