ios - sendAsynchronousRequest 使 UI 卡住

标签 ios xcode asynchronous xcode5 uiactivityindicatorview

downloadImages 是一个按钮,每当我按下它时,一个微调器应该开始滚动,一个异步请求应该 ping Google(以确保有连接)并且在收到响应后,我开始同步下载图像。

不知何故,微调器不会运行,看起来请求是同步的而不是异步的。

- (IBAction)downloadImages:(id)sender {

    NSString *ping=@"http://www.google.com/";

    GlobalVars *globals = [GlobalVars sharedInstance];
    [self startSpinner:@"Please Wait."];
    NSURL *url = [[NSURL alloc] initWithString:ping];
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:5.0];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        if (data) {
            for(int i=globals.farmerList.count-1; i>=0;i--)
            {
            //Definitions
            NSString * documentsDirectoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

            //Get Image From URL
                NSString *urlString = [NSString stringWithFormat:@"https://myurl.com/%@",[[globals.farmerList objectAtIndex:i] objectForKey:@"Image"]];
            UIImage * imageFromURL = [self getImageFromURL:urlString];



            //Save Image to Directory
            [self saveImage:imageFromURL withFileName:[[globals.farmerList objectAtIndex:i] objectForKey:@"Image"] ofType:@"jpg" inDirectory:documentsDirectoryPath];
            }
            [self stopSpinner];

        }
    }];
}

旋转器代码:

//show loading activity.
- (void)startSpinner:(NSString *)message {
    //  Purchasing Spinner.
    if (!connectingAlerts) {
        connectingAlerts = [[UIAlertView alloc] initWithTitle:NSLocalizedString(message,@"")
                                                     message:nil
                                                    delegate:self
                                           cancelButtonTitle:nil
                                           otherButtonTitles:nil];
        connectingAlerts.tag = (NSUInteger)300;
        [connectingAlerts show];

        UIActivityIndicatorView *connectingIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
        connectingIndicator.frame = CGRectMake(139.0f-18.0f,50.0f,37.0f,37.0f);
        [connectingAlerts addSubview:connectingIndicator];
        [connectingIndicator startAnimating];

    }
}
//hide loading activity.
- (void)stopSpinner {
    if (connectingAlerts) {
        [connectingAlerts dismissWithClickedButtonIndex:0 animated:YES];
        connectingAlerts = nil;
    }
    // [self performSelector:@selector(showBadNews:) withObject:error afterDelay:0.1];
}

如问:getImageFromURL 代码

-(UIImage *) getImageFromURL:(NSString *)fileURL {
    UIImage * result;

    NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]];
    result = [UIImage imageWithData:data];

    return result;
}
-(void) saveImage:(UIImage *)image withFileName:(NSString *)imageName ofType:(NSString *)extension inDirectory:(NSString *)directoryPath {
    if ([[extension lowercaseString] isEqualToString:@"png"]) {
        [UIImagePNGRepresentation(image) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"png"]] options:NSAtomicWrite error:nil];
    } else if ([[extension lowercaseString] isEqualToString:@"jpg"] || [[extension lowercaseString] isEqualToString:@"jpeg"]) {
        [UIImageJPEGRepresentation(image, 1.0) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"jpg"]] options:NSAtomicWrite error:nil];
    } else {
        NSLog(@"Image Save Failed\nExtension: (%@) is not recognized, use (PNG/JPG)", extension);
    }
}

最佳答案

那是因为您要创建一个异步操作,然后使用 [NSOperationQueue mainQueue]; 告诉它在主线程上执行。

相反,创建一个新的 NSOpeartionQueue 实例并将其作为参数传递。

NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];

关于ios - sendAsynchronousRequest 使 UI 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20031267/

相关文章:

ios - 光线模糊效果?

ios - 仅一个屏幕的横向方向模式 - iPhone

python - 使用python进行异步文件分发

ios - 优化技巧? AS3 iOS AIR 3.0

ios - 发布我的应用程序的独家 ios5 版本

ios - Xcode:如何在不丢失对目标的所有引用的情况下轻松重命名所有文件扩展名而不一一重命名?

ios - 尝试将 Flutter 添加到 iOS 应用程序时,命令 PhaseScriptExecution 因非零退出代码而失败

xcode - 核心数据保存错误(NSValidationErrorKey,Cocoa错误1570)保存NSDate

javascript - ajax调用时执行另一个函数的原因

javascript - 我应该始终对返回 promise 的函数使用 redux-saga `call` 效果吗?