Wie kann ich wissen, wenn nsoperation queue hat alle Anträge, so dass ich neu laden mein tableview?
Ich bin das herunterladen von Daten von verschiedenen links mit ASIHTTPRequest und NSOperationQueue zu
download im hintergrund-thread. Wenn eine Anfrage abgeschlossen hat, ich parse in mit requestFinished
delegate-Methode ASIHTTPRequest. Ich möchte zum aktualisieren der Daten im tableview, wenn alle Anfragen in
der Warteschlange abgeschlossen wurde. Gibt es eine Möglichkeit zu wissen, Wann ein NSOperationQueue verarbeitet hat alle
Anfragen? ich meine queue hat eine variable wie "isEmpty" oder jeder Delegierte Methode wie 'queueDidCompletedAllOperation'?
bitte helfen.
Hier ist der code:
//source
@interface SourceModel : NSObject
@property (nonatomic, retain) NSString * link;
@property (nonatomic, retain) NSString * name;
@end
//for rssGroup
@interface CompleteRSSDataModel : NSObject
@property (nonatomic,strong) SourceModel * source;
@property (nonatomic,strong) KissXMLParser * parser;
@property (nonatomic,strong) NSArray * rssArticles;
@end
- (void)viewDidLoad
{
for (int index=0; index<[rssGroups count]; index++) {
NSString * urlString = [[[rssGroups objectAtIndex:index] source] link];
NSURL *url = [NSURL URLWithString:urlString];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request setDelegate:self];
//set this request's tag to group index of this source(link). See requestFinished for use of this :)
[request setTag:index];
[self.queue addOperation:request];
}
}
- (void)requestFinished:(ASIHTTPRequest *)request {
NSLog(@"%@",@"RSS Data got from internet successfully :))");
int groupIndex = [request tag];
CompleteRSSDataModel * group = [rssGroups objectAtIndex:groupIndex];
group.parser = [[KissXMLParser alloc]initWithData:[request responseData]];
if (group.parser == nil) {
NSLog(@"%@",@"Failed - Error in parsing data :((");
}
else {
NSLog(@"%@",@"Data Parsed successfully :))");
group.rssArticles = [group.parser itemsInRss];
//So i want to check here that queue is empty, reload data, but as my information, i don't know any method like hasCompletedAllRequested
//if(self.queue hasCompletedAllRequests) {
// [self.tableview reloadData];
//}
}
}
- (void)requestFailed:(ASIHTTPRequest *)request {
NSLog(@"%@",@"Error in Getting RSS Data from internet:((");
}
- Sie werden wahrscheinlich wollen, um zu teilen, was du schon versucht hast hier -- d.h., Forschung, Probleme, etc. Eine Wand der code ist nicht wirklich etwas tun für jeden, der helfen möchte.
- Vielleicht haben Sie Recht. Ich brauche zum Bearbeiten der Frage. Vielen Dank für die Anregung
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn alle arbeiten abgeschlossen, dann die
operations
array-count gleich null sein wird.Um dies zu überprüfen, können Sie Key-Value-Observation Coding Beobachter der
operations
SchlüsselNSOperationQueue
Setzen die Beobachter für die wichtigsten
opertions
werden wie unten:Dann tun Sie dies in Ihrem observeValueForKeyPath wie unten:
Nachdem iOS 4.0 können Sie die Eigenschaft
operationCount
wieself.queue.operationCount == 0
statt zu überprüfen, wie diese[self.queue.operations count] == 0
Ich weiß, das wurde schon beantwortet, aber für zukünftige Leser, wenn Sie AFNetworking und insbesondere, AFHTTPRequestOperation können Sie etwas wie das hier tun:
Dies ist für einen downloader, fügt einen download zu einem NSOperationQueue, benachrichtigt dann die zwei progress bars: 1 für die Datei Fortschritte, und 1 für den gesamten Fortschritt.
Hoffe, das hilft
Ein paar Optionen Sprung bei mir:
Verwenden
ASINetworkQueue
statt, und legen SiequeueDidFinishSelector
, so wird es Ihnen sagen, wenn es fertig ist. Dies gibt Ihnen auch die Gelegenheit, nicht nur das updateUIProgressView
Blick nicht nur auf die einzelnen Zeilen, sondern auch noch eines für den gesamten download-Prozess.Könnte Sie etwas hinzufügen, um Ihre
NSOperationQueue
wäre das einfach nur eine Methode aufzurufen, um dann aktualisieren Sie Ihre UI (in der Haupt-Warteschlange, natürlich)? Durch hinzufügen zu der Warteschlange, es würde nicht um es zu bekommen, bis es deaktiviert die Warteschlange. Oder in eine andere Warteschlange, rufen SiewaitUntilFinished
, an welcher Stelle Sie können die Aktualisierung der Benutzeroberfläche.Blick auf Ihre Kommentare, wie es aussieht, sind die Aktualisierung Ihrer Benutzeroberfläche in
requestFinished
, aber unzufrieden sind, weil Sie denken, es könnte besser sein, zu warten, bis die updates erfolgen. Ich persönlich bevorzuge für die Aktualisierung der Benutzeroberfläche, request,, dass, wenn es langsam, bekommen Sie interim-feedback, anstatt zu warten, für alles. Erfolgt dies ordnungsgemäß, aber ich mag die Aktualisierung der Benutzeroberfläche, als ich entlang gehen. Zugegeben, einige Prozesse eignen sich nicht für die.Auf diesen letzten Punkt, ich denke, der trick ist, das zu tun diese updates, so dass es nicht störend ist. Speziell, wenn UI eine
UITableView
, werden Sie wahrscheinlich tun nicht wollentableView.reloadData
, die lädt dann die gesamte Tabelle. Stattdessen werden Sie wahrscheinlich wollen, um zu sehen, ob das Handy noch geladen (übercellForRowAtIndexPath
, dieUITableView
Methode, nicht zu verwechseln mit derUITableViewController
MethodetableView:cellForRowAtIndexPath
) und wenn es ist, aktualisieren Sie, dass eine Zeile, z.B.:requestFinished
. Der trick ist, nicht aktualisieren Sie die gesamte Benutzeroberfläche, obwohl, aber nur die entsprechende Zeile. Ich aktualisiert meine Antwort entsprechend. Klar, Sie können warten, bis das Ende (in dem Fall würde ich nicht empfehlenself.queue.operation.count
, sondern ich würde die NutzungsetQueueDidFinishSelector
zu genau festlegen, was Methode, die Sie haben wollen, die aufgerufen wird, wenn die Warteschlange abgeschlossen ist), aber ich denke, es ist eine viel bessere Benutzer-Erfahrung, um nahtlos die Aktualisierung der Benutzeroberfläche, wie die Daten kommt, für jedenrequestFinished
.