NSOperation, start vs main

Laut Apple-Dokument auf NSOperation, wir haben zu überschreiben main – Methode für nicht-parallele Operationen und start Methode für gleichzeitige Vorgänge. Aber warum?

InformationsquelleAutor Anshu | 2016-07-23



2 Replies
  1. 23

    Erstens, im Hinterkopf behalten, dass „konkurrierende“ und „nicht-gleichzeitigen“ etwas haben spezielle Bedeutungen in NSOperation, die dazu neigen, um Leute zu verwirren (und werden Synonym verwendet mit „asynchrone/synchrone“). „Gleichzeitig“ bedeutet „der Betrieb verwaltet seine eigenen Parallelität und Staat.“ „Nicht-gleichzeitigen“ bedeutet „die Methode erwartet etwas anderes, in der Regel einer queue zum verwalten der Parallelität und will default-Zustand ist die Handhabung.“

    start alle default-Zustand ist die Handhabung. Teil davon ist, dass es setzt isExecuting, dann ruft main und wenn main gibt, löscht es isExecuting und setzt isFinished. Da Sie den Umgang mit Ihrem eigenen Staat, das wollen Sie nicht (wollen Sie nicht verlassen main um den Vorgang zu beenden). So müssen Sie implementieren Ihre eigenen start und nicht anrufen super. Nun, Sie konnte immer noch main Methode, wenn Sie wollte, aber da hast du schon überschreiben start (und das ist die Sache die nennt main), die meisten Menschen setzen Sie einfach den code in start.

    Als Allgemeine Regel gilt, verwenden Sie nicht die gleichzeitige Vorgänge. Sie sind selten, was Sie meinen. Sie definitiv meine nicht „Dinge, die im hintergrund laufen.“ Beide Arten von Operationen können im hintergrund laufen (und weder hat im hintergrund laufen). Die Frage ist, ob Sie Standard system-Verhalten (non-concurrent), oder ob Sie damit umgehen wollen alles selbst (concurrent).

    Wenn Ihre Idee der Behandlung selbst ist „spin up, ein NSThread“ du bist fast sicher etwas falsch (es sei denn, Sie tun dies, um eine Schnittstelle mit C/C++ – Bibliothek, die es erfordert). Wenn es um die Schaffung einer Warteschlange, du bist wahrscheinlich tun es falsch (NSOperation hat alle Arten von Funktionen zu vermeiden). Wenn es fast alles, was aussieht wie „manuelles handling, die Dinge in den hintergrund,“ du bist wahrscheinlich tun es falsch. Der Standard – (nicht-gleichzeitige) Verhalten ist sicherlich besser als das, was Sie tun werden.

    Denen parallele Operationen können hilfreich sein in Fällen, die die API, die Sie verwenden, die bereits verarbeitet Parallelität für Sie. Eine nicht-gleichzeitigen Betrieb endet, wenn main gibt. So was, wenn Ihr Betrieb wickelt eine asynchrone Sache wie NSURLConnection? Eine Möglichkeit damit umzugehen, ist die Verwendung einer Versand-Gruppe und rufen Sie dann dispatch_wait am Ende Ihrer main so dass es nicht zurückkehren, bis alles fertig ist. Das ist ok. Ich mache es die ganze Zeit. Aber es blockiert ein thread, der sonst nicht blockiert werden, die Abfälle einige Ressourcen und in einigen aufwendigen Ecke Fälle könnte dazu führen, deadlock (wirklich aufwendig. Apple behauptet, es ist möglich, und Sie haben es gesehen, aber ich habe nie in der Lage, es zu passieren, selbst auf Zweck).

    Also eine andere Weise, die Sie es tun könnten, ist, Euch selbst zu definieren als eine gleichzeitige operation, und legen Sie isFinished mit der hand in Ihren NSURLConnection delegate-Methoden. Ähnliche Situationen passieren, wenn Sie das einwickeln anderen asynchronen Schnittstellen wie Dispatch-I/O und gleichzeitige Vorgänge effizienter sein kann für, die.

    (In der Theorie, die gleichzeitige Vorgänge können auch nützlich sein, wenn Sie möchten, führen Sie eine operation ohne Verwendung einer Warteschlange. Ich kann mir vorstellen, dass einige sehr verworrenen Fälle, in denen dies Sinn macht, aber es ist eine Strecke, und wenn Sie in diesem Boot, ich nehme an, Sie wissen, was Sie tun.)

    Aber wenn Sie irgendwelche Fragen haben, benutze einfach die Standard-nicht-conurrent Verhalten. Sie können fast immer das Verhalten, das Sie möchten, die Möglichkeit mit wenig Aufwand (vor allem, wenn Sie eine Versand-Gruppe), und dann müssen Sie nicht haben, um wickeln Sie Ihr Gehirn um die etwas verwirrende Erklärung des „gleichzeitigen“ in den docs.

  2. 0

    Ich würde davon ausgehen, dass die gleichzeitige und nicht gleichzeitige ist nicht nur eine fahne-irgendwo, aber ein sehr wesentlicher Unterschied. Durch die zwei unterschiedlichen Methoden, ist es absolut sicher, dass Sie nicht verwenden, eine gleichzeitige operation, wo Sie verwenden sollten, eine nicht-gleichzeitigen eins-oder Umgekehrt.

    Wenn man es denn falsch, der code wird absolut nicht funktionieren, weil dieses design. Das ist, was Sie wollen, weil Sie sofort zu beheben. Wenn es nur eine Methode, dann mit der gleichzeitigen statt der nicht-gleichzeitigen führen würde, zu sehr subtilen Fehlern, die möglicherweise sehr schwer zu finden. Und nicht-parallele statt Auger wird zu performance-Problemen führen, die man auch verpassen könnte.

    • Ich denke nach dem main beendet sets „isFinished“ wahr. Es kann einer der Gründe sein.
    • Diese Antwort scheint zu unterstellen, dass „gleichzeitig“ bedeutet „läuft im hintergrund“ oder so ähnlich. Dies ist nicht, was „gleichzeitig“ bedeutet in NSOperation. Gleichzeitigen und nicht-gleichzeitigen Operationen können sowohl im hintergrund laufen (und so haben die „subtilen Fehlern“, die Sie erwähnen, wegen der multi-threading-Verstöße). Wenn Sie ausführen können, ohne eine Warteschlange, die Sie entweder vollständig synchron sind. Wenn Sie mit einer Warteschlange (seit 10.6) beide werden auf einem hintergrund-thread. Die Standard – start Anrufe main. Gleichzeitige Vorgänge überschreiben muss start (der Standard hat nicht-parallele Verhalten). Das ist die Quelle für den Unterschied.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.