在IBAction中跳过用户界面命令

Geo*_*dis 2 iphone cocoa objective-c ibaction ios

这是我的代码:

-(IBAction)saveDownloadedImage
{
    NSLog(@"Test");    EXECUTED
    indicatorView.hidden = NO;  NOT EXECUTED
    [indicatorView startAnimating];  NOT EXECUTED
    [statusLabel setText:@"WHY?"];  NOT EXECUTED
    [currentPicture setImage:[imageView image]];   EXECUTED
    ImageFileManager *fileManager = [[ImageFileManager alloc] init]; EXECUTED
    [fileManager saveImageToDisk:currentPicture]; EXECUTED
    indicatorView.hidden = YES;
    [statusLabel setText:@"Image saved successfully."]; EXECUTED
    saveButton.enabled = NO; EXECUTED
Run Code Online (Sandbox Code Playgroud)

}

节约的过程大约需要5秒钟.因此,在UI中查看指标是正常的.但没有任何反应!任何的想法?

Sul*_*han 7

一切都在执行.您的问题是saveImageToDisk调用是同步的,您是从UI线程调用它.当您阻止UI线程时,没有任何东西被重新绘制.显示指示器但是直到IBAction返回它再次隐藏时才能将其绘制到​​屏幕上.

您必须异步调用保存方法.
阻止UI线程永远不是一个好主意.

编辑:请参阅以下问题的答案以获得正确的解决方案:在ios中异步调用数据库

Edit2:可能的解决方案之一(未测试)


-(IBAction)saveDownloadedImage {
    indicatorView.hidden = NO; //Note you can use hidesWhenStopped property for this
    [indicatorView startAnimating];
    [statusLabel setText:@"BECAUSE..."];
    [currentPicture setImage:[imageView image]];

    [NSThread detachNewThreadSelector:@selector(save) toTarget:self withObject:nil]
}

- (void)save {
    @autoreleasepool {
        ImageFileManager *fileManager = [[ImageFileManager alloc] init];
        [fileManager saveImageToDisk:currentPicture];

        [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];
    }
}

- (void)updateUI {
    indicatorView.hidden = YES;
    [statusLabel setText:@"Image saved successfully."];
    saveButton.enabled = NO;
}

Run Code Online (Sandbox Code Playgroud)