2012-11-13 6 views
6

Ich bin sehr neu in Xcode und Objective-C, also weiß ich nicht wirklich, was ich noch mache! ;-)
Grundsätzlich möchte ich eine IPhone-Anwendung haben, die möglicherweise zwei Threads ausführen kann, die später UDP Sockets verwenden, um mit anderen Apps zu kommunizieren.Erstelle zwei Threads in Objective-C

Ich habe Funktionen zu reagieren, wenn die start-Thread/stop-Thread Schaltfläche in der Benutzeroberfläche gedrückt werden, jetzt möchte ich sie mit Code füllen, um tatsächlich erstellen und starten die Threads.

  • Was wäre die richtige Vorgehensweise hier?
  • Muss ich die Unterklasse NSThread?
  • Wo implementiere ich den Code, den die neuen Threads ausführen werden?

    Ich kann eine Laufmethode oder etwas ähnliches nicht sehen. Ich nehme an, das hat etwas mit der selector zu tun, die ich nicht verstehe.

+0

Lesen Sie die [Programmieranleitung für Threading] (http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/Introduction/Introduction.html) und die [NSThread-Referenz] (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSThread_Class/Reference/Reference.html). Wenn Sie 'NSThread' ableiten, überschreiben Sie normalerweise die' main' Methode. – omz

+5

Ich schlage vor, Sie verwenden [Versandwarteschlangen] (http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102 -SW24) statt. – Kevin

+0

I zweite Versandwarteschlangen. – Wevah

Antwort

14

Verwenden Sie dispatch queues. Sie sind im Wesentlichen leichtgewichtige Threads, für die Sie sich nicht direkt Gedanken über Threading oder Warteschlangen machen müssen.

-(void) spawn 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     [self doWorkInBackground]; 
    }); 
} 

Sie können eine der integrierten Warteschlangen oder Ihre eigenen verwenden.

Und Sie sollten wahrscheinlich auch auf blocks lesen, insbesondere die Speicherverwaltung Aspekt.

+0

Hallo Danke für die Antwort, ich begann den Leitfaden zu lesen. Soweit ich es jetzt verstehe, können wir jedoch serielle oder gleichzeitige Warteschlangen haben. In seriellen Fällen wird immer nur eine Aufgabe ausgeführt, was für mich nicht ausreicht, da zwei Aufgaben gleichzeitig ausgeführt werden können. So würde ich eine gleichzeitige Warteschlange benötigen, aber das System verwaltet, wie viele Aufgaben parallel ausgeführt werden. Ich muss jedoch genau die zwei Aufgaben ausführen, wenn der Benutzer sie benötigt. Im Allgemeinen würde ich jedoch 2 Blöcke oder Funktionen erstellen müssen, die jeweils einen "Thread" ausführen und sie in eine Warteschlange stellen? – user1809923

+0

Da Blöcke inline mit dem Rest des Codes geschrieben werden, und ich hätte einen Block für jeden Thread und die Threads sind nicht so kurz, ich frage mich, ob das ist wirklich der richtige Weg zu gehen, unter Berücksichtigung der Code-Übersicht. – user1809923

+0

Sie können Blöcke out-of-line einfach gut zu –

1
- (void)performBlockInBackground:(void (^)())block { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     block(); 
    }); 
} 

Dann rufen Sie es wie folgt aus:

[self performBlockInBackground:^{ 
    NSLog(@"Log from background"); 
}]; 
+0

Diese Methode wird abstürzen, wenn Sie nicht überprüfen, ob der Block nicht NULL ist. – danielbeard

+0

@danielbeard Ja natürlich, aber warum in aller Welt nennst du '[self performBlockInBackground: NULL];'? – NSAddict

+0

Wenn der Block in einem anderen Objekt gespeichert ist und die Zuordnung aufgehoben wird, ist der Block NULL. Z.B. 'someObject.actionBlock' – danielbeard

1

Sie können auch mit NSOperation betrachten. Es verwendet Dispatcherwarteschlangen unter der Haube, bietet aber eine übergeordnete API und die Möglichkeit, laufenden Betrieb abzubrechen (was für Sie hilfreich sein könnte).