iPhone SDK: Как узнать, когда завершилось фоновое задание? - PullRequest
0 голосов
/ 16 ноября 2010

Мы пытаемся заставить фоновую задачу работать с целью включения индикатора активности на экране рабочего помещения. Насколько мы понимаем, это требует создания фонового потока для его запуска. Я также понимаю, что никакие обновления GUI не могут быть выполнены в фоновом потоке.

Учитывая это, вот общая схема того, что должно произойти.

a.) Предварительная проверка полей. Убедитесь, что пользователь не вводил неверные данные б.) Настройка фоновой задачи. c.) Обработка результатов из фоновой задачи

Вот как это выглядит в коде:

-(IBAction)launchtask:(id)sender 
{
    //validate fields
    [self validateFields];

    /* Operation Queue init (autorelease) */
    NSOperationQueue *queue = [NSOperationQueue new];

    /* Create our NSInvocationOperation to call loadDataWithOperation, passing in nil */
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                            selector:@selector(backgroundTask)
                                                                              object:nil];

    /* Add the operation to the queue */
    [queue addOperation:operation];
    [operation release];


    //TO DO: Add any post processing code here, BUT how do we know when it is done???
    ConfirmationViewController *otherVC;

    //show confirm
    //if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    //{
    //  otherVC = [[ConfirmationViewController alloc] initWithNibName:@"ConfirmationViewPad" bundle:nil];
    //}
    //else
    {
        otherVC = [[ConfirmationViewController alloc] initWithNibName:@"ConfirmationView" bundle:nil];
    }

    //TO DO: Let's put this in a struct
    otherVC.strConfirmation = strResponse;
    otherVC.strCardType = strCardType;
    otherVC.strCardNumber = txtCardNumber.text;
    otherVC.strExpires = txtExpires.text;
    otherVC.strCustomerEmail = txtEmail.text;

    [self.navigationController pushViewController:otherVC animated:YES];
    [otherVC release];
    otherVC = nil;  


}

Пока что это работает довольно хорошо, за исключением того, что у нас пока нет способа узнать, когда фоновая задача завершена. Только после его завершения мы можем обработать результаты фоновой задачи. Прямо сейчас это не работает, потому что нет синхронизации с этими двумя. Как решить?

Еще одна вещь, заметил, что счетчик теперь отображается в строке состояния. Это хорошо, но кажется, что оно не исчезнет после завершения фоновой задачи? Что делать?

Заранее спасибо.

1 Ответ

0 голосов
/ 16 ноября 2010

Возможны следующие варианты:

  • значение ключа отслеживает свойство 'operationCount' в NSOperationQueue и ждет, пока оно достигнет 0 (или, что эквивалентно, свойство 'operations' и проверит счет)
  • заставьте ваши операции запустить небольшое уведомление о том, что они выполнены (возможно, в главном потоке с executeSelectorOnMainThread: ...), и подождите, пока не будет получено правильное количество уведомлений.

[РЕДАКТИРОВАТЬ: я вижу, вы спрашивали конкретно о старом SDK 3.0.В этом случае наблюдайте за операциями и проверяйте количество, потому что свойство operationCount датируется SDK 3.0]

В общем случае нет автоматической системы запуска и остановки счетчика.Вам придется поговорить об этом самостоятельно.Тем не менее, в спиннинге есть одно замечательное свойство: он продолжает вращаться, даже если основной поток заблокирован, поэтому, если вы перебрасываете нить только для этой цели, вам на самом деле это не нужно.

Появляется спиннерв строке состояния, чтобы показать выборки данных, я считаю.Если он продолжает вращаться, то у вас все еще продолжаются запросы URL, ожидаете ли вы на самом деле результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...