Почему не отключить управление просмотром в режиме просмотра с удаленным доступом немедленно отключить UIImagePickerController на ios5? - PullRequest
4 голосов
/ 07 декабря 2011

У меня есть UITableViewController, который выскакивает UIImagePickerController, пользователь делает снимок, нажимает кнопку «Использовать», сборщик отклоняет, чтобы показать пользовательский вращатель миниатюр во время обработки изображения, затем вращатель заменяется фактическим уменьшенным изображением в конце обработки.

По крайней мере, так было в iOS4. Теперь с iOS5 он просто сидит там, обрабатывая, пока не закончится, и тогда все работает правильно. Но я хочу, чтобы этот спиннер был там, чтобы пользователь знал, что что-то происходит, в противном случае, похоже, он просто завис.

Итак, у меня есть это:

- (void) actionSheet: (UIActionSheet *)actionSheet didDismissWithButtonIndex (NSInteger)buttonIndex {
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.allowsEditing = NO;
    // yada, yada, yada
    [self presentModalViewController:picker animated:YES];
    [picker release];
}

И тогда это вызывается, когда пользователь выбирает «Использовать»:

- (void) imagePickerController: (UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    [self dismissModalViewControllerAnimated:YES];
    [self performSelectorOnMainThread:@selector(processImage:) withObject:info waitUntilDone:NO];
    animate = true;
}

И затем вызывается для выполнения обработки во время вращения эскиза:

- (void) processImage:(NSDictionary *)info
{
    UIImage *image = nil;
    NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType];
    // processing of image
    animate = false;
    [activityImageView stopAnimating];
    [activityImageView release];
    [self.tableView reloadData];
}

Как я уже сказал, он отлично работал с iOS4, но с iOS5 такой удачи нет. Так в чем же дело? Средство выбора изображений в конечном итоге закрывается, так почему же оно не отменяется немедленно?

Ответы [ 2 ]

4 голосов
/ 08 декабря 2011

Я не уверен, почему существует несоответствие между iOS4 & iOS5 по этому вопросу.Но ваше описание зависания пользовательского интерфейса вполне соответствует приведенному вами коду.Селектор выполнения в основном потоке делает именно это, выполняя селектор в основном потоке, из которого вы вызываете.Из-за этой установки waitUntilDone: в NO не имеет смысла, так как он не отправляется в другой поток, он просто работает по порядку.Вы, вероятно, получите желаемые результаты, просто поменяв порядок, например, так:

[self dismissModalViewControllerAnimated:YES];
animate = true;
[self performSelectorOnMainThread:@selector(processImage:) withObject:info waitUntilDone:NO];

Но учтите, что в лучшем случае это будет рискованно, поскольку я предполагаю, что // processing of image не содержит параллелизма.Я предпочитаю блоки для параллелизма.И вдобавок ко всему, мне нравятся вложенные блоки, чтобы упростить отслеживание параллелизма, например:

-(void)doSomeStuffInBackground{
    // Prepare for background stuff
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        // Do background stuff
        dispatch_async(dispatch_get_main_queue(), ^{
            // Update UI from results of background stuff
        });
    });
}

Итак, учитывая это, я бы предложил нечто более похожее на это:1014 * Это разгрузит основную работу в фоновый поток, чтобы пользовательский интерфейс оставался отзывчивым.

0 голосов
/ 24 февраля 2013

Попробуйте использовать

[[picker presentingViewController] dismissViewControllerAnimated:YES completion:nil]; 

вместо:

[[picker parentViewController] dismissModalViewControllerAnimated: YES];
...