2011-01-12 3 views
1

Ich habe eine App, die eine verwendet, um dynamisch von einer externen API basierend auf Benutzereingabe zu suchen.Fehlermeldung, dass UIKit nicht von einem sekundären Thread aufgerufen werden soll

Die App sucht die externe API fein und Ergebnisse korrekt angezeigt, aber wenn ich eine Zeile aus den Suchergebnissen auswählen, friert der Bildschirm ein und ich bekomme diesen Fehler;

Versucht, die Web-Sperre von einem anderen Thread als der Haupt-Thread oder die Web-Thread UIKit erhalten soll nicht von einem sekundären Thread

Ich habe absolut keine Ahnung, genannt werden, wie ich dieses Problem beheben .

Hier ist der Code;

- (void) run: (id) param { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL: [self URL]]; 
    [parser setDelegate: self]; 
    [parser parse]; 
    [parser release]; 
    [delegate parseDidComplete]; 
    [pool release]; 
} 

- (void) parseXMLFile: (NSURL *) url 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [self setURL: url]; 
    NSThread* myThread = [[NSThread alloc] initWithTarget:self 
               selector:@selector(run 
    object: nil]; 
    [myThread start]; 
    [pool release]; 
} 
+1

Wie holen Sie die API-Daten? Sieht so aus, als ob du das asynchron in einem anderen Thread machst. UIKit ist nicht threadsicher, also müssen UI-Sachen immer im Hauptthread gemacht werden. Können Sie uns einen relevanten Code geben? – Felix

+0

Hier ist der Code; - (void) run: (id) param { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSXMLParser * parser = [[NSXMLParser-Zuordnung] initWithContentsOfURL: [Eigen-URL]]; [Parser setDelegate: self]; [Parser analysieren]; [Delegat parseDidComplete]; } - (void) parseXMLFile: (NSURL *) URL { NSAutoreleasePool * Pool = [[NSAutoreleasePool Alloc] init]; [self setURL: url]; NSThread * myThread = [[NSThread alloc] initWithTarget: Selbst Selektor: @selector (run Objekt: nil]; [MyThread starten]; } – hmthur

+0

ich Thread bin mit, so dass der Bildschirm nicht, während die externe API gefriert Ist es möglich, dass ich das Problem lösen kann? BTW, ich verstehe nicht, was genau dieses Problem bedeutet (UIKit sollte nicht von einem sekundären Thread aufgerufen werden) – hmthur

Antwort

10

„Versucht das Web Sperre von einem anderen Thread als dem Haupt-Thread oder die Bahn Gewinde UIKit sollte nicht von einem sekundären Thread aufgerufen zu erhalten“

wird konzeptuell

Die Fehlerbehebung einfach; Aktualisiere die Benutzeroberfläche nicht aus deinem Thread.

Unter der Annahme, die parseDidComplete ist, wo die Nachricht stammt, so etwas wie dieses wird „Arbeit“:

[delegate performSelectorOnMainThread: @selector(parseDidComplete) withObject: nil waitUntilDone: YES]; 

„Arbeit“, weil Threading hart ist und diese Antwort völlig ignoriert alle Synchronisierungsprobleme Sie haben könnten.

Beachten Sie, dass Sie mit NSOperation und NSOperationQueue besser dran wären. Sie sind gut dokumentiert und es gibt eine Reihe von Beispielen.

+0

Ich kenne NSOperation und NSOperationQueue nicht. Können Sie ein ähnliches Beispiel für NSOperation oder NSOperationQueue angeben, das ich als Referenz verwenden kann? – hmthur

+1

Lesen Sie die Dokumentation; es bietet mehr Informationen und bessere Beispiele, als ich in SO eingeben könnte. – bbum

+0

@bbum Was ist der Vorteil der Verwendung von NSOperation und Queue? Wenn Sie bereits mit 'performSelectorOnMainThread 'implementiert haben? Wenn du einen Blogartikel darüber geschrieben hättest, würde ich es lesen;) Thx. –

1

Ich würde die Linie vermuten:

[delegate parseDidComplete]; 

Wenn die Delegate-Klasse mit UIKit Komponenten interagieren, dann der Hintergrund-Thread, der die XML-Inhalte abgerufen wird, dann wird die Front-End-Objekte aufrufen aufweisen müssen, alle sind im Hauptthread.

Möglicherweise möchten Sie mithilfe von NSOperation und NSOperationQueue die asynchronen Vorgänge durchführen. Ich glaube, dass dies einen sichereren Weg bietet, mit dieser Art von Anwendungsfällen umzugehen.

+0

Sie sind richtig. Sie können das zu Ihrer Antwort ab hinzufügen Ove. –

Verwandte Themen