Dauerschleife soll txt-Datei prüfen

  • Dauerschleife soll txt-Datei prüfen

    Hallo Profis,

    ich habe mal wieder ein Anliegen:

    es soll in einer Schleife alle 10 Sekunde geprüft werden, ob in einer txt-datei eine 1 oder eine 0 steht (und es steht auch nur entweder 0 oder 1 drin, kein anderer Text).
    Die txt-Datei liegt dabei auf einem anderen rechner und ich kann nur per http:// drauf zugreifen.
    Also so 192.168.1.11/text/test.txt

    Diese Schleife soll durch eine if-Bedingung gestartet oder gestoppt werden.

    Wie macht man so etwas? Ich habe schon vom "parsen" gelesen, finde aber keinen Ansatz, wie man so etaws dann macht.
    Wieder reichen meine bescheidenen Xcode Kenntnisse nicht aus.

    Würde mir jemand weiterhelfen?

    Danke und Gruß
    Dirk
  • Ok, danke!

    Ich schaue mir das an und versuche es zu verstehen.

    Bezweifele jedoch, daß ich das alleine hinbekomme.

    Wer vielleicht ein wenig Zeit übrig hat, der kann mir durch ein Beispiel helfen.
    Meist verstehe ich das an Beispielen viel besser als aus dem Manual.

    Ich beiss mich da mal rein....

    Danke nochmal

    Gruß
    Dirk
  • Parsen brauchst du bei einem Wert nun wirklich nicht, ist auch eher ne Einsteigeraufgabe, solltest du auch allein hinbekommen. Anbei trotzdem mal ein Beispiel.

    Quellcode

    1. if (!aTimer)
    2. aTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(checkTxt:) userInfo:nil repeats:YES];
    3. else {
    4. [aTimer invalidate];
    5. aTimer = nil;
    6. }
    7. - (void)checkTxt:(NSTimer *)theTimer {
    8. NSString *txt = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://.../CheckMe.txt"]];
    9. if ([txt isEqualToString:@"0"]) {
    10. // Post NSNotification / Methode aufrufen etc.
    11. } else if ([txt isEqualToString:@"1"]) {
    12. // Post NSNotification etc.
    13. }
    14. }
    Alles anzeigen

    Jetzt wäre deine Aufgabe, das Laden der txt asynchron zu gestalten ;)
    Siehe NSURLConnection usw.

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

  • Super, dankeschön!

    Das mit dem NSString hatte ich hinbekommen. Hab mir die Zähne am Timer ausgebissen.

    Was meinst Du mit: " das Laden der txt asynchron zu halten?"

    Gruß
    Dirk

    PS: ah, ok. Habs schon kapiert. Wenn ich nicht klarkomm, meld ich mich einfach nochmal.... ;)

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

  • Verdammt, da war schon jemand schneller, ich hätte nicht erst Radfahren sollen ;)
    Jetzt lade ich aber meinen Code auch noch ab - ist eine Variante mit Verbesserungspotential, aber Eigenleistung muss ja auch sein ;)

    Quellcode

    1. #import
    2. @interface ESAppDelegate : NSObject
    3. {
    4. NSTimer *timer;
    5. }
    6. @property (assign) IBOutlet NSWindow *window;
    7. -(IBAction)startTimer:(id)sender;
    8. -(void)checkFile;
    9. @end
    Alles anzeigen

    Quellcode

    1. #import "ESAppDelegate.h"
    2. @implementation ESAppDelegate
    3. @synthesize window = _window;
    4. -(void)startTimer:(id)sender
    5. {
    6. if (timer == nil) {
    7. NSLog(@"Timer started....");
    8. timer = [NSTimer scheduledTimerWithTimeInterval:10.0
    9. target:self
    10. selector:@selector(checkFile)
    11. userInfo:nil repeats:YES];
    12. } else {
    13. NSLog(@"Timer stopped!");
    14. [timer invalidate];
    15. timer = nil;
    16. }
    17. }
    18. -(void)checkFile
    19. {
    20. NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:@"/Users/xyz/test.txt"];
    21. if (file == nil) {
    22. NSLog(@"Could not open file!");
    23. }
    24. NSData *data = [file readDataToEndOfFile];
    25. NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    26. if ([string isEqualToString:@"1"]) {
    27. NSLog(@"State is: %@", string);
    28. }
    29. }
    30. @end
    Alles anzeigen

    Gruß
    Vertex
  • jetzt muss ich es nochmal hoch holen.

    Er liefert mir bei folgendem scriptschnipsel immer : could not open file

    Quellcode

    1. -(void)checkFile
    2. {
    3. NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:@"http://192.168.2.28:82/User/test.txt"];
    4. if (file == nil) {
    5. NSLog(@"Could not open file!");
    6. }
    7. NSData *data = [file readDataToEndOfFile];
    8. NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    9. if ([string isEqualToString:@"1"]) {
    10. NSLog(@"State is: %@", string);
    11. }
    12. }
    Alles anzeigen


    Das heisst doch, er kommt nicht an die Datei ran, richtig? Die Datei ist auf dem entfernetem Rechner vorhanden und lässt sich auch z.B. im Safari öffnen.
    Kann das NSFileHandle nicht über http...... zugreifen?

    Wie kann ich das dann lösen, wenn´s so sein sollte?
    Jemand noch eine Idee?

    Danke und Gruß
    Dirk
  • critical_limit schrieb:

    Jemand noch ne Idee wie´s mit NSFilehandle geht?

    Gar nicht. Die URL versteht meines Wissens nach nur "file:/pfad"...

    Der Richtige Weg ist mit NSURLConnection und NSURLRequest. Die tragen sich dann in der RunLoop ein (steuern also den select).
    Dein Timer macht dann einen -start und sobald Daten da sind wird eine delegate-Methode aufgerufen. delegate kann Dein ESAppDelegate sein in der Du bisher programmiert hast und auch den Timer erhälst.
  • Hm, das versteh ich leider (noch) nicht.

    Habe es dann so versucht:

    Quellcode

    1. - (void)checkTxt:(NSTimer *)timer {
    2. NSString *txt = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://192.168.2.28:82/user/test.txt"]];
    3. if ([txt isEqualToString:@"0"]) {
    4. // Post NSNotification / Methode aufrufen etc.
    5. } else if ([txt isEqualToString:@"1"]) {
    6. // Post NSNotification etc.
    7. }
    8. }


    geht aber auch nicht.

    Wäre klasse, wenn das ein Profi mal für mich Laien richtig stellen könnte.
    Ich weiß zwar, was ihr meint, bekomme es aber noch nicht umgesetzt. Deshalb meine Bitte.

    Danke und Gruß
    Dirk