我正在构建一个使用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的新手!
感谢您的帮助!
答案 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行之前。