带线程的程序/方法流程

时间:2013-04-29 17:02:20

标签: objective-c multithreading user-interface uialertview

我有一个启动更新过程的UIAlertView UIAlertView会询问用户是否要更新。

这是我的代码:

- (void)reachabilityChanged:(NSNotification *)notification {
    if ([connection isReachable]){
        [updateLabel setText:@"Connection Active. Checking Update Status"];
        [[[UIAlertView alloc] initWithTitle:@"Update Available" message:@"Your File Database is Out of Date. Would you like to Update?\nNote: Updates can take a long time depending on the required files." delegate:self cancelButtonTitle:@"Later" otherButtonTitles:@"Update Now", nil] show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex == 1) {
        [self updateFiles:[UpdateManager getUpdateFiles]];
    }
}

上面的代码运行正常,但是,在我的updateFiles:方法中,我需要进行一些UI调整。

- (void)updateFiles:(NSArray *)filesList {
    for (NSDictionary *file in filesList) {
        [updateLabel setText:[NSString stringWithFormat:@"Downloading File: %@", [file objectForKey:@"Name"]]];
        [UpdateManager updateFile:[file objectForKey:@"File Path"]];
    }
    [updateIndicator stopAnimating];
    [updateLabel setText:@"Update Completed"];
}

直到运行updateFiles方法中的for语句之后,UIAlertView才会被忽略。

我无法让updateLabel显示当前正在下载的文件,但在更新过程结束时,我们会在标签中获得“更新已完成”。

有人可以帮忙吗?

更新

我开始怀疑这更像是一个被一些繁重的同步过程推迟的过程。例如,我的[UpdateManager getUpdateFiles]方法很重,需要从网上获取资源。与我的[UpdateManager updateFile:[file objectForKey:@"File Path"]];方法类似。

有什么方法可以强制UI更新优先于这些方法吗?

我只是想向用户提供有关正在发生的事情的一些反馈。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。

我无法更新UI并在同一个线程上处理一些繁重的方法 由于我只能在主线程上更新UI,因此我必须进行一些重新组织以确保进程在后台线程上,然后将UI更改提升为主线程。

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex == 1) {
        [self performSelectorInBackground:@selector(updateFiles:) withObject:[UpdateManager getUpdateFiles]];
    }
}

- (void)updateFiles:(NSArray *)filesList {
    for (NSDictionary *file in filesList) {
        [updateLabel performSelectorOnMainThread:@selector(setText:) withObject:[NSString stringWithFormat:@"Downloading File: %@", [file objectForKey:@"Name"]]];
        [UpdateManager updateFile:[file objectForKey:@"File Path"]];
    }
    [updateIndicator stopAnimating];
    [updateLabel setText:@"Update Completed"];
}

因此,我将updateFiles:发送到后台并宣传setText:以及对主线程的任何其他UI更改。