2012-03-26 12 views
4

Ich brauche wirklich Hilfe hier. Ich bin verzweifelt an diesem Punkt.NSOperation in NSOperationQueue wird nicht ausgeführt

Ich habe NSOperation, die, wenn hinzugefügt, die NSOperationQueue nicht ausgelöst wird. Ich habe einige Protokollierung der NSOperation Status zu sehen und das ist das Ergebnis:

Queue operations count = 1 
Queue isSuspended = 0 
Operation isCancelled? = 0 
Operation isConcurrent? = 0 
Operation isFinished? = 0 
Operation isExecuted? = 0 
Operation isReady? = 1 
Operation dependencies? = 0 

Der Code ist sehr einfach. Nichts Besonderes.

Jetzt meine Operation viele Dinge auf die Hauptmethode, aber das Problem wird nie aufgerufen. Das Haupt wird nie ausgeführt. Die seltsamste Sache (glaub mir, ich bin nicht verrückt .. noch). Wenn ich einen Haltepunkt in irgendeine NSLog-Zeile oder in die Erstellung der Operation einfüge, wird die Hauptmethode aufgerufen und alles wird perfekt funktionieren.

Dies funktioniert seit langem gut. Ich habe in letzter Zeit einige Änderungen vorgenommen und anscheinend etwas vermasselt. Eine dieser Änderungen bestand darin, das Gerät auf iOS 5.1 SDK (iPad) zu aktualisieren.

Um etwas hinzuzufügen, habe ich die iPhone (iOS 5.1) Version dieser Anwendung, die das gleiche NSOperation-Objekt verwenden. Der Unterschied liegt nur in der Benutzeroberfläche und alles funktioniert einwandfrei.

Oh, und das scheitert nur am eigentlichen Gerät. Im Simulator funktioniert alles gut.

Jede Hilfe wird wirklich geschätzt.

Grüße,

Antwort

3

Ok, ich dieses Problem endlich lösen.

Das Problem, das ich hatte, war wegen einer NSOperation, die ständig im Hintergrund lief (aber in einer anderen Warteschlange). Diese Operation blockiert jeden anderen Thread (NSOperation), der ausgeführt werden soll. Dies geschah nur in iPad 1, weil es nicht Dual-Core ist.

Mein NSOperation wurde auf dem Hauptverfahren so etwas wie dies zu tun:

- (void)main 
{ 
    while (![self isCancelled]) { 
     //Do stuff 
    } 
} 

Und die NSOperation wurde es contantly die ganze Zeit tun

Dumme mir, ich gab das OS Zeit nicht zu arbeiten mit anderen Threads, so das Hinzufügen eines Schlafes machte den Trick

- (void)main 
{ 
    while (![self isCancelled]) { 
     [NSThread sleepForTimeInterval:0.5]; 
     //Do Stuff 
    } 
} 

Dieser Schlaf gibt dem Betriebssystem die Chance, mit anderen Threads zu arbeiten.

Warum sollte ein Breakpoint erledigt werden? ... der Debugger stoppte alle Threads und da der Breakpoint in meiner anderen NSOperation war, wurde dieser Thread ausgeführt.

+0

Das muss eine aufschlussreiche Debugging-Sitzung gewesen sein. Für mich war es das. –

+0

also .... wir müssen jedes Mal schlafen schlafen? Ich verstehe es nicht –

5

Wenn der Betrieb gleichzeitig, müssen Sie -start implementieren, nicht -Main.

+0

Der Vorgang ist nicht gleichzeitig. Vielen Dank ! –

0

Ok, dieses Problem tritt nur bei iPad 1-Geräten auf, die mit dem SDK 5.1 kompiliert wurden. Ich habe es mit einem iPad 1 mit iOS 4.2.1 und iPad 1 mit iOS 5.1 versucht. Beides gibt die gleichen Probleme.

Für sicher, dies wurde in beiden iPads mit der Anwendung arbeiten mit SDK kompiliert 4.3

2

Ich hatte das gleiche Problem, aber die Auflösung zu meiner war nicht die gleiche, also dachte ich, ich würde meine Antwort hier auch für zukünftige Leute wie mich werfen.

Mein Problem war, dass in meiner NSOperation Unterklasse, ich hatte:

@property CGPoint start; 

die, wenn sie synthetisiert, wobei das Verfahren erzeugt:

-(CGPoint)start 

die überschreibt NSOperation die - (void) beginnen; Methode, die der Signifikant für eine nicht-gleichzeitige NSOperation ist, und verhinderte, dass alle regulären Dinge, die in - (void) auftreten, auftreten, wodurch verhindert wird, dass die - (void) main-Methode überhaupt aufgerufen wird.

Sobald ich meine Eigenschaft zu etwas anderem als Start umbenannt hat, hat es gut funktioniert.