Bereiche
News
Rewind
Tipps & Berichte
Forum
Galerie
Journals
Events
Umfragen
Themenwoche
Kleinanzeigen
Interaktiv
Anmelden
Registrierung
Zu allen empfangenen Nachrichten
Suche...
Zur erweiterten Suche
Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum
>
Entwickler
>
ObjC: Oberfläche aktualisiert nicht
ObjC: Oberfläche aktualisiert nicht
Christoph_M
28.12.11
18:32
Moin,
ich glaube meine Frage ist recht einfach für jemanden der in Objektive C tiefer drin steckt, deswegen schiess ich gleich los:
Ich generiere eine Liste von IP Adressen und möchte diese während sie generiert werden in ein NSTextView schreiben.
Der Code sieht so aus:
while(true) {
// Nächste IP generieren
buff = [self getNextIPAdress:buff];
[textView setString:[[[textView string] stringByAppendingString:@"\n"] stringByAppendingString:buff]];
// Abbruchkriterium
if([buff isEqualToString:[endIP stringValue]])
break;
}
Alles läuft im Main Thread ab und funktioniert auch, ausser dass das Textfeld erst am Ende geupdated wird und nicht bei jedem Schleifendurchlauf. Kann man das ändern? Ich hätte gerne dass das Textfeld während der IP Generierung anwächst.
Vielen Dank und viele Grüße,
Christoph
Hilfreich?
0
Kommentare
qbert
28.12.11
19:17
Der Bildschirm wird erst beim nächsten Lauf durch die Main-Eventschleife geupdated. Den blockierst Du mit deiner while-Schleife. Mach einen dispatch-Block (GCD Handbuch lesen) aus der Schleife, dann sollte es gehen.
Hilfreich?
0
Christoph_M
29.12.11
03:48
Danke qbert!
Falls jemand anderes auch drauf stößt, so funktionierst: (benötigt 10.6 wg. GCD)
- (IBAction)generateIPs:(id)sender
{
// Neue Queue erstellen:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
// Main Queue für GUI:
dispatch_queue_t main = dispatch_get_main_queue();
dispatch_async(queue,^{
ipAdressArray = [[NSMutableArray alloc] init];
NSString *buff = [NSString stringWithString:[startIP stringValue]];
[textView setString:buff];
while(true) {
buff = [self getNextIPAdress:buff];
//NSLog(buff);
[ipAdressArray addObject:buff];
dispatch_sync(main,^{
[textView setString:[[[textView string] stringByAppendingString:@"\n"] stringByAppendingString:buff]];
});
// Abbruchkriterium
if([buff isEqualToString:[endIP stringValue]])
break;
}
[amountOfIPs setStringValue: [NSString stringWithFormat:@"%d IPs",[ipAdressArray count]]];
});
}
Hilfreich?
0
Kommentieren
Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.