2010-09-02 4 views
0

Я не могу заставить мой интерфейс обновляться, когда вызывается мой объект, реализующий SKPaymentTransactionObserver.Обновления пользовательского интерфейса из методов SKPaymentTransactionObserver

В частности, у меня есть (UILabel *) debugLabel в моем пользовательском интерфейсе (все подключены через IB). У меня есть реализация протокола наблюдателя:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { 

    NSLog(@"paymentQueue: current thread is main thread: %@", [[NSThread currentThread] isMainThread][email protected]"YES":@"NO"); 

    for (SKPaymentTransaction *transaction in transactions) { 
     if (transaction.transactionState == SKPaymentTransactionStatePurchased) { 


      // if the store is still being viewed, update appropriately 
      if(spViewController.storeViewController) { 
       [spViewController.storeViewController transactionComplete:transaction]; 
      } 
     } 
     // other transactionStates omitted for brevity 
    } 
} 

[spViewController.storeViewController transactionComplete:transaction] выполняются, но UILabel не отображает назначенный текст.

- (void) transactionComplete:(SKPaymentTransaction *) transaction { 
    NSLog(@"CBTSVC transactionComplete"); 
    debugLabel.text = @"CBTSVC transactionComplete"; 

    // other UI updates omitted for brevity 
} 

Когда код выполняется, то NSLog выводит строку на консоль, но UILabel не обновляется. Я подтвердил, что обратные вызовы, сделанные в SKPaymentTransactionObserver, происходят в основном потоке, поэтому пользовательский интерфейс должен обновляться. (Право?)

Что дает? Должно быть, пропущено что-то простое?

Спасибо за какие-либо идеи, указатели и т.д.

ответ

0

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

Я решил это, переместив обработку транзакций в собственный поток через NSOperation. Из NSOperation я обновляю пользовательский интерфейс по мере необходимости (путем обратного вызова в основной поток).

Благодарим за внимание!

Смежные вопросы