2012-10-01 24 views
2

我不得不从服务器上下载图片,但我不想创建NSURLConnection,我知道UIKit不是线程安全的,所以我试过了,只需要确认一下,如果这是安全的还是会导致崩溃截至目前它工作正常。)我试过以下这是从后台线程访问UI工具包的安全方式吗?

看看交换机的情况2。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    switch (indexPath.row) { 
    case 0: 
    { 
     CreateNewSurveyViewController *vc=[[CreateNewSurveyViewController alloc] init]; 
     [self.navigationController pushViewController:vc animated:YES]; 
     [vc release]; 
     break; 
    } 
    case 1:{ 
     MySurveyViewController *mySurveyViewController=[[MySurveyViewController alloc] init]; 
     [self.navigationController pushViewController:mySurveyViewController animated:YES]; 
     [mySurveyViewController release]; 
     break; 
    } 
    case 2:{ 

     self.progressHud.hidden = NO; 
     [self performSelectorInBackground:@selector(loadProfileImage) withObject:nil]; 
     break; 
    } 
    default: 
     break; 
    } 
} 
-(void)loadProfileImage { 

    NSData* profileImageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:self.userAccount.profileImageURL]]; 
    [self performSelectorOnMainThread:@selector(launchSettingsView:) withObject:profileImageData waitUntilDone:YES]; 

} 

-(void)launchSettingsView:(NSData*)profileImageData { 
    self.userAccount.userImage = [UIImage imageWithData:profileImageData]; 
    self.progressHud.hidden = YES; 
    SettingsViewController* settingsViewController=[[SettingsViewController alloc] init]; 
    settingsViewController.userAccount = self.userAccount; 
    settingsViewController.delegate = self; 
    [self.navigationController pushViewController:settingsViewController animated:YES]; 
    [settingsViewController release]; 
} 

回答

1

这对我来说看起来很安全。你可以在后台线程上完成所有的网络连接,然后只用你回叫的主线程方法触摸UI。通常人们会使用GCD或NSOperationQueue,但这也应该起作用。

+0

我通常使用GCD,但我的客户希望支持ios 3.2及以上版本,因此GCD无法使用。 –

+1

@AnkitSrivastava你的客户有不合理的期望! – jrturton

+0

@jrturton我知道......但客户永远是对的。 –

1

只要在主线程上完成实际的UI更新工作,你就会好起来的。