iphone - IBAction 中跳过的用户界面命令

标签 iphone objective-c ios cocoa ibaction

这是我的代码:

-(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

保存过程大约需要 5 秒。所以在 UI 中看到指示器是正常的。但是没有任何反应!有什么想法吗?

最佳答案

一切都已执行。您的问题是 saveImageToDisk 调用是同步的,您是从 UI 线程调用它的。当您阻塞 UI 线程时,不会重绘任何内容。指示器已显示,但在 IBAction 返回之前无法将其绘制到屏幕上,此时它将再次隐藏。

必须异步调用保存方法。
阻塞 UI 线程从来都不是一个好主意。

编辑:请参阅以下问题的答案以获得正确的解决方案:asynchronous calls to database in 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;
}

关于iphone - IBAction 中跳过的用户界面命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9395361/

相关文章:

ios - RestKit 添加属性映射和关系映射

iphone - 做一个小型开源iOS API时,ARC用户和非ARC用户如何计算

ios - AVAudioPlayer 的属性给出 "Cannot assign result of this property"

ios - 如何使用自动布局在 subview 中创建 UIGestureRecognizer?

ios - 如何让 UITabBar 选择指示器图像填满整个空间?

iphone - iOS iTunes 商店国家

iphone - 如何以编程方式将音频文件从iPhone文件系统复制到 Assets 库

iphone - 在 iOS 中模拟应用程序升级

iphone - 以编程方式使 iOS 设备静音/静音?

ios - 迪尔德 : Symbol not found: _OBJC_CLASS_$_NSTextTab