2013-05-14 14 views
5

Ich verwende in meiner App die SKStoreProductViewController. Es erscheint korrekt, aber mit ein paar Sekunden Verzögerung, was die Benutzerfreundlichkeit verlangsamt.SKStoreProductViewController erscheint mit Verzögerung

Ist in meinem Code etwas nicht in Ordnung? Oder sollte ich den Benutzer informieren, dass der VC geladen wird? Denn jetzt kann man glauben, dass nichts passiert nach Drücken der Taste (die den folgenden Code auslöst):

-(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]; 
     } 
    }]; 
} 

Antwort

27

Die Verzögerung verursacht wird, weil Sie die Viewcontroller präsentieren, nachdem die Produkte sucesfully geladen wurden.

Sie können den Aufruf presentViewController:animated:completion: außerhalb des Blocks platzieren, der aufgerufen wird, nachdem die Produkte geladen wurden. In diesem Fall wird der Controller leer dargestellt und nach dem Laden der Produkte gefüllt.

etwas in diese Richtung:

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]; 

Oder Sie könnten ein „Pop-up“ Ansicht erstellen, die eine Aktivitätsanzeige zeigt, während der Controller seinen Inhalt geladen wird.

Oder Sie verwenden [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

Es gibt ein paar Möglichkeiten, dies zu umgehen.

+0

Danke, ich habe für eine Sekunde die Logik hinter den Blöcken vergessen .. Ich habe die erste Lösung verwendet und es ist in Ordnung, da der VC sein eigenes "Laden" -Label hat. Vielen Dank ! – rdurand

+0

@Matthias - Gibt es eine Idee, ob es möglich ist, für den Aufruf von loadProductWithParameters ein Timeout zu setzen? – runamok

+1

Eine Anmerkung - Apple sagt, dass Sie Ihre Geschäftskennung als NSNummer und nicht als NSString übergeben sollten. – Zack

Verwandte Themen