2016-04-23 19 views
0

Ich bin ein Junior-Entwickler und ich bin fest in dieser sehr einfachen Sache, die ich nicht herausfinden kann. Ich habe eine Klasse AFHTTPRequestOperationManager erweitert. Bedeutet, es ist @interface apiClient : AFHTTPRequestOperationManager in dieser Klasse Ich habe alle meine Code, die Bilder von Imgur API abrufen und AFNetworking verwenden Ich habe die Daten bis zu einem Level analysiert, wo ich nur die Verknüpfung der Bilder zu bekommen.
Jetzt ist die rootViewController welche eine UICollectionViewController erweitert. In ihm ist viewDidLoad Ich sende einen Anruf an meine APIClient und es beginnen, von Methoden zu Methoden und schließlich geben Sie mir eine NSMutableArray, die den Bilder Link enthält, die ich in der UIImageView meiner CollectionViewCell verwenden werde.
Die Frage ist ich dies mit den Endglieder zurück zu meinem rootViewController heißt GalleryCollectionViewControllerÜbergeben Sie die analysierten Daten an UICollectionView

GalleryCollectionViewController *gcvc = [[GalleryCollectionViewController alloc] init]; 
    [gcvc recieveGalleryImagesLinks:galleryImgLinkArr]; 

Das Problem, dass es numberOfItemsInSection in gcvc ist senden ruft, bevor er eine Antwort von der API erhalten. Das bedeutet, dass die Zählung Null wird und daher die Daten nicht angezeigt werden. Also wie kann ich es bekommen, um den API-Aufruf von apiClient Klasse zuerst und dann die viewController. Ich hoffe, ich habe mein Problem klar benannt und wenn es notwendig ist, mehr Code zu teilen, werde ich es tun.



UPDATE
Nach Genehmigung dieser Methoden, um die Galerie Bilder bekommt:

- (void)galleryAlbum:(NSString *)ID { 

NSLog(@"ID is %@", ID); 

[self GET:[NSString stringWithFormat:@"%@3/gallery/album/%@", self.baseURL,ID] parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 

    self.galleryData = (NSDictionary *)responseObject; 

    galleryDataArr = [[NSMutableArray alloc] init]; 
    galleryDataArr = [self.galleryData valueForKey:@"data"]; 

    galleryImagesArr = [[NSMutableArray alloc] init]; 
    galleryImagesArr = [galleryDataArr valueForKey:@"images"]; 

    galleryImgLinkArr = [[NSMutableArray alloc] init]; 
    galleryImgLinkArr = [galleryImagesArr valueForKey:@"link"]; 

    GalleryCollectionViewController *gcvc = [[GalleryCollectionViewController alloc] init]; 
    [gcvc recieveGalleryImagesLinks:galleryImgLinkArr]; 

} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

    NSLog(@"Failed #2"); 

    }]; 
} 

Hier gcvc das Array mit Bildern Link empfängt und dann die Sammlung Ansicht Nachladen als:

-(void)recieveGalleryImagesLinks:(NSMutableArray *)array 
{ 
    self.imageLinks = [[NSMutableArray alloc] initWithArray:array]; 
    NSLog(@"Array: %@",self.imageLinks); 
    [self.collectionView reloadData]; 
} 

Aber es gibt "UICollectionView: muss mit einem Nicht-Null-Layout-Parameter initialisiert werden", obwohl das Array nicht ist leer.

+0

Aktualisieren Sie Ihre Frage mit dem entsprechenden Code, der die Daten erhält. Sie müssen die Sammlung (im Hauptthread) neu laden, wenn die Daten abgerufen werden. – rmaddy

+0

@rmaddy Jetzt prüfen –

+0

Sie erstellen einen neuen Ansichtscontroller, anstatt auf den vorhandenen Ansichtscontroller zuzugreifen. – rmaddy

Antwort

0

Diese Codezeile unten ist falsch:

GalleryCollectionViewController *gcvc = [[GalleryCollectionViewController alloc] init]; 
[gcvc recieveGalleryImagesLinks:galleryImgLinkArr]; 

Sie benötigen einen Block verwenden oder Ansatz delegieren hier, die das Array übergeben werden Ihren collectionViewController zurück und die collecrionView neu zu laden.

Sogar Ihr Methodenaufruf von der API-Klasse scheint für den Delegatenansatz korrekt zu sein, aber machen Sie eine Protokollmethode. Auf diese Weise müssen Sie nicht viel ändern. Es wird so etwas wie unten sein:

[self.delegate recieveGalleryImagesLinks:galleryImgLinkArr 

Und wenn API aufrufen und zur Reaktion zeigen activityIndicator zum Laden von Daten warten.

+0

Ich habe versucht es mit '@ protocol' zu tun, wie du es vorgeschlagen hast, aber es scheint ein Problem zu geben' No type or protocol named' hier ist der Link dazu: http://stackoverflow.com/questions/36827903/no- Typ oder Protokoll benannt –

Verwandte Themen