ログファイルに数字のリスト(1行、2行、1行に1つずつ)を記録するシェルスクリプトがあります。 ObjCアプリケーションでログファイルをX秒ごとに読み込み、最後にログファイルに記録された番号に基づいて進行状況バーを更新する必要があります。シェルスクリプトからライブ出力を読み込み、進行状況バーを更新する
これを行うにはどうすればよいですか?
ログファイルに数字のリスト(1行、2行、1行に1つずつ)を記録するシェルスクリプトがあります。 ObjCアプリケーションでログファイルをX秒ごとに読み込み、最後にログファイルに記録された番号に基づいて進行状況バーを更新する必要があります。シェルスクリプトからライブ出力を読み込み、進行状況バーを更新する
これを行うにはどうすればよいですか?
代わりに?この方法では、ファイル内で実際に何かが起きたときにのみコードが実行されます。
NSTimerのインスタンスを作成して、X秒ごとに、ファイルを読み込んでプログレスバーを更新する別のメソッドを呼び出すことができます。そのメソッドはNSStringのstringWithContentsOfFile:
を使用してファイルを文字列に読み込んだ後、適切に解析します。例えば
:
// Create the invocation of the method to call
NSUInteger X = 2; // Change depending on how often you want the timer fired
NSMethodSignature *signature = [self methodSignatureForSelector:@selector(read)];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
// Create the timer, adding it to the default run loop
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:X
invocation:invocation
repeats:YES];
以降では、セレクタread
を定義します。
- (void)read {
NSString *fileContents = [NSString stringWithContentsOfFile:@"aFile.txt"];
NSArray *lines = [fileContents componentsSeparatedByString:@"\n"];
NSString *lastLine = [lines lastObject];
// Your own parsing and updating code here
}
あなたは明確な停止点が必要な場合は、あなたがあなたのクラスの内部IVARにtimer
を格納することができ、その後、実行中のプロセスが完了したと判断した場合は、内の解析コードを使用すると、いつでも[timer invalidate];
が呼び出されます。
関連ドキュメント:
scheduledTimerWithTimeInterval:invocation:repeats:
invocationWithMethodSignature:
methodSignatureForSelector:
NSFileHandleのを使用しないのはなぜ答えてくれてありがとう、私は – indragie
私はreadDataInBackgroundAndNotifyと呼ばれる方法を見つけることができませんでしたが、私はreadInBackgroundAndNotifyを見つけたことを試してみましょう。私はこのコードを試した:http://pastie.org/592668とセレクタは何らかの理由で呼び出されることはありません。私はファイルが更新されていることを確認しています。何か案は? – indragie
まず、間違った通知名を登録しています。 '@" NSFileHandleReadCompletionNotification "ではなく、' NSFileHandleReadCompletionNotification'を監視する必要があります。次に、ファイルハンドルのファイルディスクリプタを 'fcntl'を使用して非ブロックとして設定してみてください。 http://developer.apple.com/documentation/Darwin/Reference/ManPages/man2/fcntl.2.htmlを参照してください。ポーリングを必要としない方法見つけるための –
1 - 私自身の答えよりもはるかに優れ:)を – Tim