使用网络打开时出现问题的应用程序

时间:2014-08-04 04:35:18

标签: objective-c iphone xcode

我正在构建一个使用Instagram API显示照片的应用,但我遇到了一些麻烦。当没有网络连接并且我找到导致问题的代码时,应用程序崩溃。

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
self.accessToken = [userDefaults objectForKey:@"accessToken"];

if (self.accessToken == nil) {
    [SimpleAuth authorize:@"instagram" options:@{@"scope": @[@"likes"]} completion:^(NSDictionary *responseObject, NSError *error) {

        self.accessToken = responseObject[@"credentials"][@"token"];

        [userDefaults setObject:self.accessToken forKey:@"accessToken"];
        [userDefaults synchronize];

        [self refresh];
    }];
} else {

  [self refresh];

}

我发现[self refresh];导致问题出现在else区块中,我尝试用这样的警报视图替换它

UIAlertView *networkError = [[UIAlertView alloc] initWithTitle:@"Network Error" message:@"Please connect your device to a network and restart application" delegate:nil cancelButtonTitle:nil otherButtonTitles:nil];
[networkError show];

然而,有了这个问题,我发现如果我用网络连接打开应用程序,我仍然会收到警报。任何帮助都会很棒,因为我还是Objective C的新手!

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我知道Treehouse的代码:)。

问题是if(self.accessToken == nil){/ ...。 /}阻止只有在未使用您的Instagram凭据授权应用程序时才能执行。

成功登录后,它将始终执行else {/.../}块中的代码。如果它已连接到Internet,它将执行其工作,下载,显示图像等。如果您插入代码以显示警报,它将始终这样做,因为您实际上是通过该代码表示​​。

如果要检查是否存在某些连接,则需要在所有代码之前执行此操作,显示错误并在连接不可用时立即返回。但是,假设总是有Internet连接,作者试图保持简单。

希望它让你理解它。

这是您可以用来检查是否有连接的一些代码:

//显示一些活动指标

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0),^ {     //做点什么......

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

NSURL *url = [NSURL URLWithString:@"http://www.apple.com/"];

NSString *s = [NSString stringWithContentsOfURL:url
                                       encoding:NSUTF8StringEncoding
                                          error:nil];

dispatch_async(dispatch_get_main_queue(), ^{

    // hide the activity indicator

    self.connected = (s != nil);

    [[UIApplication sharedApplication] endIgnoringInteractionEvents];

    if (self.isConnected)
    {
        NSLog(@"self.connected == YES");
    }
    else
    {
        NSLog(@"self.connected == NO");
        NSString *alertMessage = @"In order to load images, you need an active Internet connection. Please try again later!";

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Sorry!"
                                                        message:alertMessage
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];

        [alert show];
    }
});

});

您显然需要为您的课程添加属性。您可以插入此代码:

@interface LDPhotosViewController ()

@property (nonatomic, copy, getter = isConnected) NSString *connected;

@end

位于LDPhotosViewController.m文件的顶部,位于@implementation行之前。