Auf "Code" warten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Auf "Code" warten

    Hey Leute,

    Direkt um Problem:
    Ich hab einen MensaViewController mit einem PageViewController, 5 MensaContentViewController welche mithilfe der PageView gesteuert werden.
    Beim initialisieren des MensaViewController werden in einem Thread Daten aus dem Internet geladen, diese werden von dem MensaContentViewController benötigt.
    Die MensaContentViewController sollen erst für den PageViewController initialisiert werden, wenn die Daten komplett geladen sind, ansonsten soll solange die xib des MensaViewController angezeigt werden.

    => Im Endeffekt: Wie warte ich auf anderen Code? Kann ich iwie ein Event auslösen, das die Daten geladen sind, wobei das Event dann das initialisieren/anzeigen startet?

    lG
  • Thallius schrieb:

    NSNotification

    Gruß

    Claus

    scheint zu klappen :) Vielen Dank
    Trotzdem noch einige Frage zu folgendem Code:

    Quellcode

    1. - (void)getMensaData
    2. {
    3. if ([self isReachable]) {
    4. NSLog(@"%@", @"Mensaseite aufrufbar");
    5. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    6. //code executed in the background
    7. NSData* foodsupplierData = [NSData dataWithContentsOfURL:
    8. [NSURL URLWithString:@"http://17.foodspl.appspot.com/mensa?id=bhv&format=json"]];
    9. if (foodsupplierData) {
    10. self.mensaData = [NSJSONSerialization
    11. JSONObjectWithData:foodsupplierData
    12. options:kNilOptions
    13. error:nil];
    14. NSLog(@"%@", @"Mensadaten geladen");
    15. //AN DAS DICT DAS AKTUELLE DATUM/TIMESTAMP HÄNGEN
    16. [self saveMensaDataToCache:mensaData];
    17. }
    18. dispatch_async(dispatch_get_main_queue(), ^{
    19. [[NSNotificationCenter defaultCenter] postNotificationName:@"NoteForMensaLoaded" object:self];
    20. //code executed on the main queue
    21. });
    22. });
    23. } else {
    24. NSLog(@"%@", @"Mensaseite nicht aufrufbar -> Cache");
    25. self.mensaData = [self loadMensaDataFromCache];
    26. [[NSNotificationCenter defaultCenter] postNotificationName:@"NoteForMensaLoaded" object:self];
    Alles anzeigen



    1. Wofür ist das "^" vor der geschweiften Klammer? Entspricht das einer anonymen Klasse wie in Java?
    2. Das dispatch_async entspricht einem Thread?
    3. Ist der Aufruf im If-Teil an dieser Stelle sinnvoll?
  • zu 3. Überleg dir noch mal was du da so postest im Notification-Center. Die If-Schleife mag sinnvoll sein aber auch dazu ein Denkanstoß: Wenn self erreichbar ist, warum übergibst du die URL dann so wie du es tust (als String)? Die URL muss doch dann schon bekannt sein ;)
    Und im If-Teil wie auch im Else-Teil postest du das Selbe ins Notificationcenter...dann kannst du das Posten auch direkt hinten an stellen.
    Und zu inneren If-Schleife: Überleg dir mal warum foodsupplierData, so wie es da steht, nie NIL sein kann, d.h. die Bedingung der inneren If-Schleife wird immer wahr sein.
    Und das Posten im Notification-Center in einen extra Thread zu legen...öhm, schau dir nochmal die Dokumenation zum Notificationcenter an.
    [self setSignature:null];
    [[self postCount] increment];
  • hadschii schrieb:


    2. Das dispatch_async entspricht einem Thread?

    dispatch_async() bedeutet, dass es asynchron, also außerhalb des von dir vorgegebenen Kontrollflusses abgearbeitet wird. Dazu wird regelmäßig ein Thread von Nöten sein, aber das ist ein Implementierungsdetail. Ebenso ist es möglich, dass dipatch_sync() auf demselben Thread durchgefürht wird (regelmäßig) aber nicht zwingend.

    Mit GCD solltest du nicht mehr in Threads denken, sondern in Abarbeitungsschlangen.
    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"?
  • @Mike:
    Das isReachable prüft ob eine Verbindung zu der Foodsuplier-Seite möglich ist.

    Quellcode

    1. - (BOOL)isReachable {
    2. Reachability *r = [Reachability reachabilityWithHostName:@"17.foodspl.appspot.com"];
    3. NetworkStatus internetStatus = [r currentReachabilityStatus];
    4. if(internetStatus == NotReachable) {
    5. return NO;
    6. }
    7. return YES;
    8. }

    Du meinst ich sollte direkt beim Prüfen der Verbindung, wenn diese möglich ist, die Daten aus dem Netz laden? Damit ich nicht 2x die Verbindung aufbaue?
    Die innere If-Abfrage war gedacht, falls an dieser URL keine Daten liegen, sollte das Objekt doch auch nichts enthalten oder?
    Die Notification habe ich bewusst 2x gelegt, die erste dann, sobald die Daten komplett aus der URL geladen wurden (was manchmal durchaus 5s sein können), die 2te damit er die Daten aus dem Cache zur Darstellung nimmt. Sobald die Notification ausgeführt wird, beginnt der PageViewController mit dem init der ContentSeiten die diese Daten benötigen


    @Amin
    Danke für die Erklärung, ich hatte im Studium bisher nur Grundstoff in Java, daher kenne ich viele Mechaniken noch nicht
  • hadschii schrieb:

    Du meinst ich sollte direkt beim Prüfen der Verbindung, wenn diese möglich ist, die Daten aus dem Netz laden? Damit ich nicht 2x die Verbindung aufbaue?

    Ich meine: Wenn du schon prüfst, ob die Verbindung überhaupt aufgebaut werden kann dann prüf doch direkt ob dein Ziel erreichbar ist. Damit sparst du dir einen Test. ;)

    hadschii schrieb:

    Die innere If-Abfrage war gedacht, falls an dieser URL keine Daten liegen, sollte das Objekt doch auch nichts enthalten oder?

    Du erstellst mit

    Quellcode

    1. NSData* foodsupplierData= [NSData dataWithContentsOfURL: [NSURL URLWithString:@"http://17.foodspl.appspot.com/mensa?id=bhv&format=json"]]


    ein NSData-Objekt mit der angegebenen URL. Und das klappt nur dann nicht wenn die URL nicht erreichbar ist. Ist sie erreichbar (und das hast du vorher ja geprüft dachte ich), dann erstellst du immer die NSData. Wäre also ein Weg wie du dir mindestens eine if-Abfrage sparen kannst...und so kannst du auch gleich schaun ob die Seite erreichbar ist: Du versuchst ein NSData mit der URL zur Seite zu erstellen. Klappt das so ist die Seite auch erreichbar, klappt es nicht ist die Seite auch nicht erreichbar ;)
    [self setSignature:null];
    [[self postCount] increment];

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Mike ()

  • OK, warum ich gestern NSURL geschrieben hab weiß ich grad nicht mehr. Zuviel Glühwein intus gehabt oder so. Ich meinte natürlich NSData... foodsupplierData ist doch ein NSData und wenn die Seite nicht erreichbar ist kann das NSData auch nicht mit dataWithContentsOfURL: erstellt werden. Und das hab ich gestern auch überprüft bevor ich meine Antwort schrieb. Sorry für die Verwirrung :(
    [self setSignature:null];
    [[self postCount] increment];