ios: laden Sie neue Daten in die UICollectionView
Ich möchte eine Anwendung, die Anzeige von Bildern in UICollectionView.
- Bilder werden heruntergeladen vom server und zeigt dann in collectionView.
- Ich bin mit benutzerdefinierten collectionView layout in xib-Datei.
- In einer Zeit, 20 Bilder empfangen vom server.
Problem: ich kann nicht zeigen die neu heruntergeladenen Bilder in collectionView.
Hier ist mein code:
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
BOOL reloaded = NO;
static NSString *cellIdentifier = @"cvCell";
CVCell *cell = (CVCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
NSMutableArray *data = [self.dataArray objectAtIndex:indexPath.section];
NSString *cellData = [data objectAtIndex:indexPath.row];
dispatch_queue_t queue = dispatch_queue_create("com.justTest.anotherSingleApplication", NULL);
dispatch_async(queue, ^{
//code to be executed in the background
NSString *imageName1 = [[NSString alloc]initWithFormat:@"http://www.abc.com/images/thumb/%@", cellData];
NSString *url_Img1 = imageName1;
UIImage *aImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:url_Img1]]];
dispatch_async(dispatch_get_main_queue(), ^{
//code to be executed on the main thread when background task is finished
[cell.cellImage setImage:aImage];
});
});
if (indexPath.row == self.imageArray.count - 1 && !reloaded) {
getOnScrollImages *getImage = [[getOnScrollImages alloc] init]; //class to get image name from server
NSMutableArray *astring = (NSMutableArray *)[getImage getImageNameFromServer:@"list" board:@"111" pin:@"122345"]; //method to get image name from server
[self setNewTestArray:astring]; //adding newly downloaded image name into array
reloaded = YES;
dispatch_async(dispatch_get_main_queue(), ^{
[self.collectionView reloadData];
});
}
return cell;
}
Jede Anregung bitte?
HINWEIS: ich fange gerade erst mit der Entwicklung von iOS-Anwendung, kann dies eine sehr dumme Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden, die asynchron abrufen, um Daten vom server und zeigt Sie in der collectionView
Verwenden Sie eine Klasse, um das Bild herunterladen. Wenn Sie viele Bilder in einer Sammlung anzuzeigen, können Sie prüfen, zu speichern, diese Bilder zu lokale im Fall von Speicher Warnung. wenn nun viele, lassen Sie einfach das Bild in den Speicher und zeigt Sie in Ihrer Sammlung anzeigen.
den code gefolgt ist, speichern Sie das Bild auf den lokalen und Lesen der Bilddaten aus der lokalen bei der Anzeige.
in .h:
in .m
wenn Sie möchten, lassen Sie Ihr Bild im Speicher, ändern Sie einfach die Fertigstellung block:
in .h
und in .m
und auch Methoden modifizieren startDownloadImageForIndexPath, speichern Sie das Bild auf Ihr Modell zu behalten, es
Diese Methode erwartet zu haben, Antworten Sie sofort:
wenn der code nicht schnell genug reagiert zu haben, wird die app in der Regel nichts anzeigen, oder manchmal einfach nur Absturz (je nachdem, was Sie haben-setup)
Einer gemeinsamen design-pattern speichern die Informationen, die geliefert werden, um die collectionView in einer Klasse die variable (es muss nicht Eigentum, aber es oft ist). Sie lagern ETWAS in die variable, auch wenn es sich um alte oder veraltete Daten.
Dann haben Sie die Methoden definiert, die in der UICollectionViewDataSource Protokoll ziehen, was Sie brauchen, direkt von der Klasse Variablen, ohne Verzögerung.
Andere Methoden können zu Holen und abrufen und Schlinge aktualisierten Daten um, und sobald Sie fertig sind rufen Sie
reloadData:
auf den collectionView zum aktualisieren der Schnittstelle.vorausgesetzt, die asynchrone Aufrufe sind erfolgreich abrufen von Daten-schließlich sind Sie wahrscheinlich zu langsam für das, was die UICollectionViewDataSource Protokoll-Methoden werden erwartet.
Einen Vorschlag, wie, um loszulegen wäre, um den code Holen Ihre Daten auf verschiedene Methoden, und dann die Bühne der Daten in eine Klasse, variable oder zwei, die die collectionView zuverlässig zeichnen Sie aus.
Können Sie versuchen, es mit statisch geladenen Daten in das bundle auf den ersten, wenn Sie brauchen, und verschieben Sie dann in asynchronen zieht aus dem web zu.