2

サーバーからイメージをダウンロードする必要がありますが、NSURLConnection を作成したくありません。UIKit はスレッドセーフではないことがわかっているので、これを試してみました。これが安全かどうか、またはクラッシュする可能性があるかどうかを確認する必要があります (現時点では今は正常に動作しています。)私は次のことを試しました

スイッチのケース 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];
}
4

2 に答える 2

1

これは私には安全に見えます。バックグラウンド スレッドですべてのネットワーキングを行い、コールバックするメイン スレッド メソッドでのみ UI に触れます。通常、人々は GCD または NSOperationQueue を使用しますが、これも機能するはずです。

于 2012-10-01T05:28:32.177 に答える
1

実際の UI 更新作業がメイン スレッドで行われている限り、問題はありません。

于 2012-10-01T05:28:40.640 に答える