2013-05-14 21 views
5

Używam w mojej aplikacji SKStoreProductViewController. Wyświetla się poprawnie, ale z kilkuminutowym opóźnieniem, co spowalnia działanie użytkownika.SKStoreProductViewController pojawia się z opóźnieniem

Czy jest coś nie tak w moim kodzie? Czy powinienem poinformować użytkownika, że ​​VC ładuje się? Bo teraz można uwierzyć, że nic się nie dzieje po naciśnięciu przycisku (który wywołuje następujący kod):

-(void)launchApp:(id)sender { 

    // Recall on main thread if necessary 
    if (![NSThread isMainThread]) { 
     [self performSelectorOnMainThread:@selector(launchApp:) 
           withObject:sender 
          waitUntilDone:NO]; 
     return; 
    } 

    // Initialize Product View Controller 
    SKStoreProductViewController *storeProductViewController = [[SKStoreProductViewController alloc] init]; 

    // Configure View Controller 
    [storeProductViewController setDelegate:self]; 
    [storeProductViewController loadProductWithParameters:@{SKStoreProductParameterITunesItemIdentifier : @"*********"} 
              completionBlock:^(BOOL result, NSError *error) { 
     if (error) { 
      NSLog(@"Error %@ with User Info %@.", error, [error userInfo]); 
     } else { 
      // Present Store Product View Controller 
      [self presentViewController:storeProductViewController animated:YES completion:nil]; 
     } 
    }]; 
} 

Odpowiedz

27

Opóźnienie jest spowodowane, ponieważ przedstawienie viewController po produkty zostały załadowane sucesfully.

Możesz wywołać presentViewController:animated:completion: poza blokiem, który jest wywoływany po załadowaniu produktów. W takim przypadku kontroler zostanie przedstawiony jako pusty i zostanie wypełniony po załadowaniu produktów.

Coś wzdłuż tych linii:

SKStoreProductViewController *storeProductViewController = [[SKStoreProductViewController alloc] init]; 

// Configure View Controller 
[storeProductViewController setDelegate:self]; 
[storeProductViewController loadProductWithParameters:@{SKStoreProductParameterITunesItemIdentifier : @364709193} 
             completionBlock:^(BOOL result, NSError *error) { 
    if (error) { 
     NSLog(@"Error %@ with User Info %@.", error, [error userInfo]); 
    } else { 

    } 
}]; 
// Present Store Product View Controller 
[self presentViewController:storeProductViewController animated:YES completion:nil]; 

Albo można stworzyć „wyskakujące” widok, który pokazuje wskaźnik aktywności, podczas gdy regulator ładuje jej zawartość.

Albo użyć [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

Istnieje kilka sposobów, aby sobie z tym poradzić.

+0

Dzięki, zapomniałem przez chwilę o logice bloków. Użyłem pierwszego rozwiązania i nic nie szkodzi, ponieważ VC ma własną etykietę "loading". Dzięki ! – rdurand

+0

@Matthias - jakikolwiek pomysł, jeśli możliwe jest ustanowienie limitu czasu dla połączenia loadProductWithParameters? – runamok

+1

Jedna uwaga - Apple mówi, że powinieneś przekazać swój identyfikator sklepu jako numer NSN, a nie NSString. – Zack

Powiązane problemy