2

我有一個UIViewControllerUITableView作爲子視圖。當某個單元格被點擊時,應該顯示一個UIImagePickerController。由於需要很長的初始化時間,因此我在後臺執行此過程時,確實出現了這種情況。
現在我將ARC添加到了我的項目中,然後它仍然沒有工作。最初的過程凍結了用戶界面。iOS,ARC:後臺線程凍結UI

這是我的代碼。

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    [self performSelectorInBackground:@selector(initImagePickerControllerInBackground) withObject:nil]; 
} 

... 

- (void)initImagePickerController 
{ 
    if (imagePickerController != nil) 
     return; 

    imagePickerController = [[UIImagePickerController alloc] init]; 
    imagePickerController.allowsEditing = YES; 
    imagePickerController.delegate = self; 
    imagePickerController.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeImage]; 
} 

- (void)initImagePickerControllerInBackground 
{ 
    @autoreleasepool 
    { 
     [self initImagePickerController]; 
    } 
} 

我應該改變什麼才能讓它爲我工作?

回答

5

UIKit不是線程安全類,不應該從主線程外部調用。你不應該在後臺執行這個UIImagePickerController分配/交互。

+0

好的。你有什麼建議?我應該在應用程序啓動時初始化它嗎? –

+0

UIImagePicker是一個重量級的東西(如你所見),初始化相對較慢並且使用大量內存。出於這些原因,您通常希望將其創建到您需要的位置 - 因此可能不會在應用程序啓動時進行。該應用專注於imagePicker多少錢?它是主要還是次要組件?如果你反覆使用它,我會用你的tableView啓動它(只是不在後臺)。另一個建議是:在用戶第一次選擇更新圖像時懶惰地加載,也許可以通過按鈕將動作移動到詳細信息屏幕,也可以直接從單元格按鈕/選擇中移動。 – isaac

+0

我認爲一般用戶在按下按鈕選擇圖像時可能會出現延遲。我認爲他們不希望在從tableView中選擇一行時出現延遲(因此,我建議將它移動到詳細視圖上的按鈕上)。 – isaac