2016-05-02 8 views
1

In UICollectionView, wenn ich eine Zelle auswähle, wird ein neuer UIViewController geöffnet, in dem einige Informationen angezeigt werden.So verwenden Sie die Sammlung von UIColliectionViewAnsicht: didDeselectItemAtIndexPath-Methode asynchron

- (void)collectionView:(UICollectionView *)collectionView 
didDeselectItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    MyClass *myClass = [myClassArray objectAtIndex:indexPath.item]; 
    [myClass MyClassInstanceMethod]; 
} 

In neuen UIViewController einige Informationen über myClass Instanz gedruckt wird. In MyClassInstanceMethod mache ich jedoch einige HTTPrequests, die einige Daten erhalten und den Eigenschaften myClass zuweisen. Wie Sie sich denken können, ist das Problem HTTPrequests Verzögerung und ich bin nicht in der Lage, Daten zu erhalten, bevor neue Ansicht geladen werden.

Dann denke ich, dass ich meine UICollectionView öffnen soll ausgewählte Zelle die Seite nach MyClassInstanceMethod beendet es Job. Wie kann ich das umsetzen? Danke im Voraus.

+0

Wie machen Sie den Web-Service-Anruf? Benutzt du Blöcke? Ihre Frage ist unklar, da es "didSelectZzZ" vs "didDeselectZzZ" gibt. – Larme

+0

was genau willst du? bekomme deine Frage nicht richtig – Lion

+0

Ich benutze keine Blöcke. Meine Sorge/Frage ist einfach, ich will 'didDeselectItemAtIndexPath', um neue Ansicht aufgerufen werden, nachdem eine bestimmte Methode (' MyClassInstanceMethod') eine Antwort von seiner HTTP-Methode GET erhalten. –

Antwort

1

Um Ihre Methode von der Klasse gekapselt zu halten, sollten Sie einen Beendigungshandler in Ihre MyClassInstanceMethod einfügen. Wie

- (void)MyClassInstanceMethodWithCompletion:(void (^)(BOOL finished))completion { 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     // Do your HTTP Requests here 

     dispatch_async(dispatch_get_main_queue(), ^{ // This will be called just when the http requests finish 
      if (completion) { // Here you could check it out if the requests went well 
       completion(YES); // If YES return YES 
      } 
     }); 
    }); 
} 

Innerhalb des didDeselectItemAtIndexPath: können Sie diese wie nennen:

- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath { 

    MyClass *myClass = [myClassArray objectAtIndex:indexPath.item]; 
    [myClass MyClassInstanceMethodWithCompletion:^(BOOL finished) { 
     if(finished){ 
      // Call the segue 
     } 
    }]; 

} 

Ich hoffe, dass dies helfen kann.

ps: Sie haben einen Methodennamen verwendet, der mit Großbuchstaben MyClass beginnt ... normalerweise ist es besser ein Kleinbuchstabe myClass ... es ist ein besserer Ansatz, nur um einen Klassennamen eines Methodennamens zu unterscheiden.

+0

Danke, für Ihre nützliche Antwort und Rückmeldung. Dank @ Vats 'Antwort sehe ich, dass Async möglicherweise nicht notwendig ist (aber ich habe es noch nicht implementiert, es könnte auch notwendig sein). Ich werde mir deinen Weg merken. Ich wusste nichts über asynchrone Implementierung, Ihre Antwort hat es deutlich zusammengefasst. –

+0

Gern geschehen. Weitere Informationen zu GCD finden Sie unter folgendem Link: https://www.raywenderlich.com/60749/grand-central-dispatch-in-depth-part-1 –

3

Als mein Verständnis,
Sie müssen HTTP-Aufruf in

- (void)collectionView:(UICollectionView *)collectionView 
didDeselectItemAtIndexPath:(NSIndexPath *)indexPath; 

und in Erfolgsantwort machen sollten Sie Ihre UIViewController mit Details öffnen Sie es zeigen wollen.

+0

Sie haben recht, ich habe direkten Übergang "UICollectionViewCell" zu neuen "UIViewController" gemacht. Jetzt sehe ich, dass es besser ist, dieses Segment zu entfernen und meine http-Anforderungsstoffe in select-Methode zu tun, dann mache ich danach einen Übersee-Job. –

+0

@DilaraAlbayrak, (nur für Info.) Es gibt eine andere Möglichkeit zum Öffnen von UIViewController ist [self.storeboard instanziateViewControllerWithIdentifire: @ "viewController"]; – Vats

+0

Danke, es ist sehr hilfreich. Nebenbei funktioniert Ihr Weg nicht asynchron. –

Verwandte Themen