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
Christoph_M28.12.1118: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
0

Kommentare

qbert
qbert28.12.1119: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.
0
Christoph_M
Christoph_M29.12.1103: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]]];
    });    
}
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.