Umgang mit return Anweisung

  • Umgang mit return Anweisung

    Hallo zusammen.

    Ich checke wiedermal etwas nicht. Vielleicht hab ihr eine Idee.

    Ich rufe eine Methode einer anderen Klasse auf beispielsweise ([netzwerkTransfer sendeDaten: @"Hallo"];) und möchte als Rückgabewert haben ob die Daten erfolgreich gesendet worden sind.
    Das Problem ist, dass nicht "sendeDaten" den wert zurücksenden soll sondern ein Streamevent das irgendwann in den nächsten paar Sekunden auslöst.
    Jetzt könnte ich am Ende von sendeDaten eine While Anweisung platzieren die ständig abfragt ob Daten vorhanden sind aber das ist irgendwie nicht cpu schonend.
    In Visual Studio gibt sowas wie Threading.Thread.sleep(x) den man in einer While Anweisung platziert und somit die CPU weniger belastet.

    Habt Ihr eine Idee?

    Quellcode

    1. - (void) sendeDaten: (NSString*) nachricht {
    2. daten = nil;
    3. [self initNetworkCommunication];
    4. NSString *response = [NSString stringWithFormat:@"%@", nachricht];
    5. NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]];
    6. [outputStream write:[data bytes] maxLength:[data length]];
    7. }
    8. - (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {
    9. NSLog(@"stream event %i", streamEvent);
    10. switch (streamEvent) {
    11. case NSStreamEventHasBytesAvailable:
    12. if (theStream == inputStream) {
    13. uint8_t buffer[1024];
    14. int len;
    15. while ([inputStream hasBytesAvailable]) {
    16. len = [inputStream read:buffer maxLength:sizeof(buffer)];
    17. if (len > 0) {
    18. NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
    19. if (nil != output) {
    20. //Hier sollte der String Wert zurückgegeben werden
    21. }
    22. }
    23. }
    24. }
    25. break;
    26. case NSStreamEventErrorOccurred:
    27. NSLog(@"Can not connect to the host!");
    28. break;
    29. case NSStreamEventEndEncountered:
    30. [theStream close];
    31. [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    32. [theStream release];
    33. theStream = nil;
    34. break;
    35. default:
    36. NSLog(@"Unknown event");
    37. }
    38. }
    Alles anzeigen
  • Du möchtest nach erfolgreichem Senden eine Info, aber du hast den Platz dafür nach erfolgreichem Empfangen vorgesehen. Das passt schonmal nicht. Ich würde mir vermutlich "merken", dass ich etwas auf den Weg geschickt habe und dann in stream:handleEvent: auf ein "NSStreamEventHasSpaceAvailable" warten. Allerdings arbeitest Du dann mit der Annahme, dass das Event nach dem abgeschlossenen Senden gefeurt wird, was nicht zwingend sein muss.

    Vergiss nicht, dass Du hier mit einem asynchronen Verfahren arbeitest, da ist leider das, was Du möchtest, nicht wirklich vorgesehen, denn das ist ein Merkmal eines synchronen Verfahrens.