Blocks speichern

  • DroneDeveloper schrieb:

    In ARC nur ohne `autorelease`?

    Yepp

    DroneDeveloper schrieb:

    Etwas "einfacheres" als ein Array geht nicht?

    Noch einfacher? Vielleicht ein Array von id? Die musst Du dann aber selber speicherverwalten, was bestimmt nicht einfacher als ein Array ist.

    DroneDeveloper schrieb:

    Ich brauche keine Reihenfolge...

    NSMutableSet? Bringt aber wahrscheinlich auch keinen nennenswerten Vorteil gegenüber einem Array.

    Du kannst natürlich auch eine NSOperationQueue verwenden. Die führt Dir die Blocks wenigstens auch schön aus.
    „Meine Komplikation hatte eine Komplikation.“
  • jopjip schrieb:

    Meinst du schön oder schon?

    Ich meine schon schön und nicht schön schon. ;)

    jopjip schrieb:

    Wo ist das Problem die Objekte bzw. Blöcke aus dem Array zu holen und auszuführen?

    Natürlich kannst Du das auch selber machen. In die Richtung ging ja auch mein erster Vorschlag. Aber wieso etwas implementieren, was es schon gibt? DroneDeveloper wollte es ja schließlich noch einfacher als mit einem Array haben.

    Da fällt mir noch eine vielleicht etwas esoterische Lösung ein. Es geht auch mit einer Block-Property:

    Quellcode

    1. typedef void (^BlockType)();
    2. @property (nonatomic, copy) BlockType block;
    3. - (void)addBlock:(BlockType)inBlock {
    4. if(self.block) {
    5. BlockType theBlock = self.block;
    6. BlockType theNewBlock = [inBlock copy]; // Notwendig?
    7. self.block = ^() {
    8. theBlock();
    9. theNewBlock();
    10. }
    11. }
    12. else {
    13. self.block = inBlock;
    14. }
    15. }
    Alles anzeigen

    Müsste man aber erstmal testen ;)
    „Meine Komplikation hatte eine Komplikation.“
  • DroneDeveloper schrieb:

    Kann NS(Mutable)Set Fast Enumeration?

    Natürlich: developer.apple.com/library/io…le_ref/doc/uid/TP40003736

    DroneDeveloper schrieb:

    Andere Frage: Kann man irgendwie den definierten Typ (`typedef`) eines Blocks ermitteln?
    Also soetwas wie `isKindOfClass` für Blocks!?

    Was versprichst Du Dir davon?

    Thallius schrieb:

    Ic programmiere jetzt seit über 30 Jahren aber ich habe noch nie erlebt das ich mir Code merken musste um ihn später auszuführen.

    ...und was soll das bedeuten. Auch hier kannst Du den Anwendungsfall nicht beurteilen, und nur weil man etwas schon lange (nicht) macht, ist das doch kein Kriterium für Qualität. Hat das nicht sogar schon Martin Luther festgestellt? Übrigens verweise ich in diesem Zusammenhang auch noch einmal auf NSOperationQueue.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    DroneDeveloper schrieb:

    Kann NS(Mutable)Set Fast Enumeration?

    Natürlich: developer.apple.com/library/io…le_ref/doc/uid/TP40003736

    DroneDeveloper schrieb:

    Andere Frage: Kann man irgendwie den definierten Typ (`typedef`) eines Blocks ermitteln?
    Also soetwas wie `isKindOfClass` für Blocks!?

    Was versprichst Du Dir davon?

    Thallius schrieb:

    Ic programmiere jetzt seit über 30 Jahren aber ich habe noch nie erlebt das ich mir Code merken musste um ihn später auszuführen.

    ...und was soll das bedeuten. Auch hier kannst Du den Anwendungsfall nicht beurteilen, und nur weil man etwas schon lange (nicht) macht, ist das doch kein Kriterium für Qualität. Hat das nicht sogar schon Martin Luther festgestellt? Übrigens verweise ich in diesem Zusammenhang auch noch einmal auf NSOperationQueue.


    Gegenfrage. Muss man wirklich alles machen nur weil man es machen kann? Du willstcdoch nicht ernsthaftvbehaupten, dass so ein Code noch wartbar oder gar von einem anderem als dem Autor lesbar ist?

    Mich erinnert sowas an diese lustigen C einzeilerprogramme.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • In meinem Fall geht es darum, dass mehrere Requests der gleichen URL kommen (können), während die URL schon lädt.
    In dem Fall möchte ich die URL nur 1x laden aber alle Callbacks aufrufen, um alle Objekte zu benachrichtigen.
    Klar, ich könnte in dem Fall auch eine Notification posten, aber die vielen Observer machen es nicht gerade besser...
    Blocks sind hier doch deutlich schicker...
  • Thallius schrieb:

    macmoonshine schrieb:

    DroneDeveloper schrieb:

    Kann NS(Mutable)Set Fast Enumeration?

    Natürlich: developer.apple.com/library/io…le_ref/doc/uid/TP40003736

    DroneDeveloper schrieb:

    Andere Frage: Kann man irgendwie den definierten Typ (`typedef`) eines Blocks ermitteln?
    Also soetwas wie `isKindOfClass` für Blocks!?

    Was versprichst Du Dir davon?

    Thallius schrieb:

    Ic programmiere jetzt seit über 30 Jahren aber ich habe noch nie erlebt das ich mir Code merken musste um ihn später auszuführen.

    ...und was soll das bedeuten. Auch hier kannst Du den Anwendungsfall nicht beurteilen, und nur weil man etwas schon lange (nicht) macht, ist das doch kein Kriterium für Qualität. Hat das nicht sogar schon Martin Luther festgestellt? Übrigens verweise ich in diesem Zusammenhang auch noch einmal auf NSOperationQueue.


    Gegenfrage. Muss man wirklich alles machen nur weil man es machen kann? Du willstcdoch nicht ernsthaftvbehaupten, dass so ein Code noch wartbar oder gar von einem anderem als dem Autor lesbar ist?

    Mich erinnert sowas an diese lustigen C einzeilerprogramme.

    Gruß

    Claus

    Blocks sind objektiv wartbarer, weil sie Code und Kontext kapseln.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Warum benutzt du nicht ganz einfach MVC und KVO bzw. Bindings?

    Du hast ein Model mit URL_String und RecevicedData. Die Objekte dieser Klasse verwaltest du in einem ArrayController (oder CoreData oder…)

    Wenn nun ein neuer Request kommt, dann schaust du im Array ob zu der URL_Sring schon einer vorhanden ist. Wenn ja, dann hängst Du neinen Observer auf ReceivedData, schaust ob ReceivedData schon gesetzt ist und wenn ja, dann benutzt du es oder du wartest.
    Gibt es noch kein Objekt zu der URL; dann erzeugst du ein neues, hängst einen Observer auf ReceivedData, hängst es in den ArrayController. Das neue Objeckt startet den Download und wenn es fertig ist setzt es ReceivedData. Durch den KVO bekommen allle Observer jetzt Bescheid und können handeln.
    Das hat sogar den Vorteil, daß du jederzeit den Download refreshen kannst und alle die es was angehen refreshen sich automatisch mit.

    Das ist einfach, schlank und verständlich.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    Gegenfrage. Muss man wirklich alles machen nur weil man es machen kann?

    Das habe ich auch nicht behauptet. In vielen Fällen lässt sich mit Hilfe von Blocks der Code eher vereinfachen. Deswegen bietet anscheinend auch Apple immer mehr Schnittstellen auf Basis von Blocks an (z. B. Notification-Observer).

    Thallius schrieb:

    Du willstcdoch nicht ernsthaftvbehaupten, dass so ein Code noch wartbar oder gar von einem anderem als dem Autor lesbar ist?

    Das kannst Du doch gar nicht beurteilen. Du hast doch nicht eine Zeile seines Codes gesehen geschweige denn, dass Du seinen Anwendungsfall kennst.

    Wie gesagt: Apple macht mit NSOperationQueue genau das gleiche. Sind Programme, die diese Klasse nutzen, deswegen schlecht wartbar oder unverständlich?
    „Meine Komplikation hatte eine Komplikation.“
  • Hallo,

    nochmal zu der Frage ob der Block kopiert werden muss wenn ich ihn speichere.

    Ich habe das bisher so verstanden, das ein Block eh kopiert wird, wenn er ausgeführt wird und dann im eigenen Kontext läuft. Ich speichere mir quasi nur einen "Prototyp", denn ich dann eben solange behalten (retainen) muss wie ich ihn brauche.

    D.h. ich rufe einen Block auf, der Block (Speicherbereich) wird kopiert und dem Prozzi zur Ausführung untergeschoben und danach wieder freigegeben.

    Ich mach das dann so:

    Quellcode

    1. @interface OCAlertView : UIAlertView
    2. + (void)showWithTitle:(NSString *)title
    3. message:(NSString *)message
    4. completitionHandler:(void (^)(NSInteger selectedIndex))completitionHandler
    5. cancelButtonTitle:(NSString *)cancelButtonTitle
    6. otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION;
    7. @end


    Quellcode

    1. #import "OCAlertView.h"
    2. typedef void(^alertCompletitionHandler)(NSInteger selectedIndex);
    3. @interface OCAlertView ()
    4. @property (readwrite, strong) alertCompletitionHandler handler;
    5. @end
    6. @implementation OCAlertView
    7. + (void)showWithTitle:(NSString *)title
    8. message:(NSString *)message
    9. completitionHandler:(void (^)(NSInteger selectedIndex))completitionHandler
    10. cancelButtonTitle:(NSString *)cancelButtonTitle
    11. otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION;
    12. {
    13. OCAlertView *av = [[OCAlertView alloc] initWithTitle: title
    14. message: message
    15. delegate: nil
    16. cancelButtonTitle: cancelButtonTitle
    17. otherButtonTitles: otherButtonTitles, nil];
    18. [av setDelegate: av];
    19. [av setHandler: completitionHandler];
    20. [av show];
    21. }
    22. - (void)alertView:(OCAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
    23. {
    24. alertCompletitionHandler handle = [alertView handler];
    25. handle (buttonIndex);
    26. [alertView setHandler: nil];
    27. }
    28. @end
    Alles anzeigen


    Funktioniert wunderbar ohne Copy. Allerdings ist ja auch bei einem modalen Alert die Gefahr das noch jemand anderes den Block benutzt sehr gering ;)

    Ob man das jetzt machen muss, bleibt jedem selbst überlassen. Aber ich finde es ganz praktisch nicht wegen jedem Popelalert eine Delegatemethode implementieren zu müssen. Und wenn z.B. ein Viewcontroller mehrere verschiedene Alerts handlet, wird das auseinanderdröseln über das Tag oder so immer ganz blöd.

    Gruß
    Manfred
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • Thallius schrieb:

    Warum benutzt du nicht ganz einfach MVC und KVO bzw. Bindings?

    Du hast ein Model mit URL_String und RecevicedData. Die Objekte dieser Klasse verwaltest du in einem ArrayController (oder CoreData oder…)

    Wenn nun ein neuer Request kommt, dann schaust du im Array ob zu der URL_Sring schon einer vorhanden ist. Wenn ja, dann hängst Du neinen Observer auf ReceivedData, schaust ob ReceivedData schon gesetzt ist und wenn ja, dann benutzt du es oder du wartest.
    Gibt es noch kein Objekt zu der URL; dann erzeugst du ein neues, hängst einen Observer auf ReceivedData, hängst es in den ArrayController. Das neue Objeckt startet den Download und wenn es fertig ist setzt es ReceivedData. Durch den KVO bekommen allle Observer jetzt Bescheid und können handeln.
    Das hat sogar den Vorteil, daß du jederzeit den Download refreshen kannst und alle die es was angehen refreshen sich automatisch mit.

    Das ist einfach, schlank und verständlich.

    Gruß

    Claus

    KVO ist eine zusätzliche typlose Abstraktionsschicht und daher objektiv komplizierter.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?