Dispatch_async и пользовательский интерфейс

Я сделал предупреждение, информирующее пользователя о сохранении действия, я добавляю его для просмотра, сохраняю изображение и отклоняю предупреждение. Однако он работает не так, как я надеялся. Глядя на приведенный ниже код сначала в консоли, я получаю «сохранен ..», а затем «диспетчер». Я хотел бы получить противоположный эффект: сначала получить «dispath», а затем «сохранить ..» (так что напишите предупреждение на экране, затем сохраните в фоновом режиме и, наконец, отклоните предупреждение). Но я меняю изображение imageView1, поэтому я не могу переместить слияние из dispath_async, потому что это действие пользовательского интерфейса ... как это сделать тогда ...? Мне нужно сначала объединить изображения, а затем сохранить их и все это время расчета, чтобы быть начеку.

//adding alert to view
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
^{
    dispatch_async(dispatch_get_main_queue(), ^{
        //i want this to complete->
        imageView1.image = [self merge:imageView1.image and:imageView2.image];
        NSLog(@"dispatch");
    });

    //and then to do this action->
    UIImageWriteToSavedPhotosAlbum(imageView1.image, self, @selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), nil);
    NSLog(@"saved..");

    dispatch_async(dispatch_get_main_queue(), ^{
        [alert dismissWithClickedButtonIndex:0 animated:YES];
    });
});

person Nat    schedule 25.08.2011    source источник


Ответы (1)


Вам следует просто использовать dispatch_sync вместо dispatch_async. Эта функция не вернется, пока блок не будет выполнен в основном потоке.

person jtbandes    schedule 25.08.2011
comment
Я забыл добавить, что у меня есть actionSheet, где я нажимаю кнопку, чтобы вызвать вышеуказанный метод. Когда я использую dispatch_sync, actionSheet не скрывается, поэтому пользователь может видеть мое предупреждение (которое появляется в меню actionSheet в этом случае). - person Nat; 25.08.2011
comment
Извините, я должен быть более ясным. Вы все равно должны использовать dispatch_async(dispatch_get_global_queue..., но dispatch_sync(dispatch_get_main_queue... внутри него. - person jtbandes; 25.08.2011
comment
Отличный вариант! Спасибо ^^ - person Nat; 25.08.2011