从 NSURLSessionDataTask 呈现时,UIAlertController 会导致应用程序崩溃?
UIAlertController crashes app when presented from NSURLSessionDataTask?
为什么这不起作用?
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:theRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
NSString *receivedDataString = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
NSString *keyInfo = [[[[NSBundle mainBundle] infoDictionary] objectForKey:keyString] stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
NSLog(@"%@", receivedDataString);
NSLog(@"%@", keyInfo);
if (![receivedDataString isEqual:keyInfo] && ![receivedDataString isEqual: @""])
{
NSFileManager *fileManager = [NSFileManager defaultManager];
UIAlertController *alertCheckForUpdate;
UIAlertAction *noUpdateBtn = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {}];
UIAlertAction *yesCydiaUpdateBtn = [UIAlertAction actionWithTitle:@"Cydia" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString: @"cydia://sources"] options:@{} completionHandler:nil];
}];
UIAlertAction *yesSileoUpdateBtn = [UIAlertAction actionWithTitle:@"Sileo" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString: @"sileo://package/com.dave1482.powerapp"] options:@{} completionHandler:nil];
}];
if ([fileManager fileExistsAtPath:sileoPath] && ![fileManager fileExistsAtPath:cydiaPath]){
alertCheckForUpdate = [UIAlertController alertControllerWithTitle:@"New Update Available" message:[NSString stringWithFormat:@"Open Sileo to update PowerApp to v%@?", receivedDataString] preferredStyle:UIAlertControllerStyleAlert];
[alertCheckForUpdate addAction:yesSileoUpdateBtn];
} else if (![fileManager fileExistsAtPath:sileoPath] && [fileManager fileExistsAtPath:cydiaPath]) {
alertCheckForUpdate = [UIAlertController alertControllerWithTitle:@"New Update Available" message:[NSString stringWithFormat:@"Open Cydia to update PowerApp to v%@?", receivedDataString] preferredStyle:UIAlertControllerStyleAlert];
[alertCheckForUpdate addAction:yesCydiaUpdateBtn];
} else if ([fileManager fileExistsAtPath:sileoPath] && [fileManager fileExistsAtPath:cydiaPath]) {
alertCheckForUpdate = [UIAlertController alertControllerWithTitle:@"New Update Available" message:[NSString stringWithFormat:@"Open Cydia/Sileo to update PowerApp to v%@?", receivedDataString] preferredStyle:UIAlertControllerStyleAlert];
[alertCheckForUpdate addAction:yesCydiaUpdateBtn];
[alertCheckForUpdate addAction:yesSileoUpdateBtn];
} else {
alertCheckForUpdate = [UIAlertController alertControllerWithTitle:@"New Update Available" message:[NSString stringWithFormat:@"PowerApp v%@ is available but for some reason you don't have Sileo or Cydia.", receivedDataString] preferredStyle:UIAlertControllerStyleAlert];
}
[alertCheckForUpdate addAction:noUpdateBtn];
[self presentViewController:alertCheckForUpdate animated:YES completion:nil];
}
}];
[dataTask resume];
以下行使我的应用程序崩溃,这似乎是试图在块中显示我的 UIAlertController 导致的。我正在使用最新的 Xcode 和 SDK,同时面向 iOS 8+。谢谢!
[self presentViewController:alertCheckForUpdate animated:YES completion:nil];
您在崩溃时收到的错误消息是什么?我的猜测是您正在尝试从后台线程显示警报,在这种情况下您需要像这样显示它:
dispatch_async(dispatch_get_main_queue(), ^{
[self presentViewController:alertCheckForUpdate animated:YES completion:nil];
});
为什么这不起作用?
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:theRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
NSString *receivedDataString = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
NSString *keyInfo = [[[[NSBundle mainBundle] infoDictionary] objectForKey:keyString] stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
NSLog(@"%@", receivedDataString);
NSLog(@"%@", keyInfo);
if (![receivedDataString isEqual:keyInfo] && ![receivedDataString isEqual: @""])
{
NSFileManager *fileManager = [NSFileManager defaultManager];
UIAlertController *alertCheckForUpdate;
UIAlertAction *noUpdateBtn = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {}];
UIAlertAction *yesCydiaUpdateBtn = [UIAlertAction actionWithTitle:@"Cydia" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString: @"cydia://sources"] options:@{} completionHandler:nil];
}];
UIAlertAction *yesSileoUpdateBtn = [UIAlertAction actionWithTitle:@"Sileo" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString: @"sileo://package/com.dave1482.powerapp"] options:@{} completionHandler:nil];
}];
if ([fileManager fileExistsAtPath:sileoPath] && ![fileManager fileExistsAtPath:cydiaPath]){
alertCheckForUpdate = [UIAlertController alertControllerWithTitle:@"New Update Available" message:[NSString stringWithFormat:@"Open Sileo to update PowerApp to v%@?", receivedDataString] preferredStyle:UIAlertControllerStyleAlert];
[alertCheckForUpdate addAction:yesSileoUpdateBtn];
} else if (![fileManager fileExistsAtPath:sileoPath] && [fileManager fileExistsAtPath:cydiaPath]) {
alertCheckForUpdate = [UIAlertController alertControllerWithTitle:@"New Update Available" message:[NSString stringWithFormat:@"Open Cydia to update PowerApp to v%@?", receivedDataString] preferredStyle:UIAlertControllerStyleAlert];
[alertCheckForUpdate addAction:yesCydiaUpdateBtn];
} else if ([fileManager fileExistsAtPath:sileoPath] && [fileManager fileExistsAtPath:cydiaPath]) {
alertCheckForUpdate = [UIAlertController alertControllerWithTitle:@"New Update Available" message:[NSString stringWithFormat:@"Open Cydia/Sileo to update PowerApp to v%@?", receivedDataString] preferredStyle:UIAlertControllerStyleAlert];
[alertCheckForUpdate addAction:yesCydiaUpdateBtn];
[alertCheckForUpdate addAction:yesSileoUpdateBtn];
} else {
alertCheckForUpdate = [UIAlertController alertControllerWithTitle:@"New Update Available" message:[NSString stringWithFormat:@"PowerApp v%@ is available but for some reason you don't have Sileo or Cydia.", receivedDataString] preferredStyle:UIAlertControllerStyleAlert];
}
[alertCheckForUpdate addAction:noUpdateBtn];
[self presentViewController:alertCheckForUpdate animated:YES completion:nil];
}
}];
[dataTask resume];
以下行使我的应用程序崩溃,这似乎是试图在块中显示我的 UIAlertController 导致的。我正在使用最新的 Xcode 和 SDK,同时面向 iOS 8+。谢谢!
[self presentViewController:alertCheckForUpdate animated:YES completion:nil];
您在崩溃时收到的错误消息是什么?我的猜测是您正在尝试从后台线程显示警报,在这种情况下您需要像这样显示它:
dispatch_async(dispatch_get_main_queue(), ^{
[self presentViewController:alertCheckForUpdate animated:YES completion:nil];
});