0

NSStringとして関数に入力される数値を取得するために、Webサービスと通信しています。この数値は、別のアクションを実行するまで待機する正確な時間を教えてくれます。正確であることが重要です。

たとえば、文字列が「89283」の場合、これは89.283秒待つ必要があることを意味します。そのため、Objective-C for iPhoneで、この文字列を、performSelector:afterDelay:関数に渡すことができる正確な値に変換するための最良の方法を知りたいと思います。これが私のサンプルコードですが、正確ではないと思います。

NSString *myDelayString = @"89283";
int myDelay = [myDelayString intValue]/1000;
[self performSelector:@selector(myFunction) withObject:nil afterDelay:myDelay];

myDelay値は実際にはNSTimeIntervalである必要があると思いますが、私が持っている文字列からそれを作成する方法がわかりません。前もって感謝します。

4

4 に答える 4

4

倍精度を許可するように変更したコードを次に示します。

NSString *myDelayString = @"89283";
NSTimeInterval myDelay = [myDelayString doubleValue]/1000;
[self performSelector:@selector(myFunction) withObject:nil afterDelay:myDelay];

整数除算を避けることができるように、文字列を double として取得するには doubleValue を使用します。NSTimeInterval の型は iphone では double として定義されているため、double の結果をそこに格納してから、セレクターの afterDelay: 部分に渡すことができます。

于 2009-12-08T01:17:08.623 に答える
1

NSTimeInterval は double であり、整数除算を行っています。そのタイプを から に変更するだけintdouble、うまくいくはずです。

于 2009-12-08T00:57:39.780 に答える
1

前のイベントが完全に処理されるまで常に待機する必要があるため、実行ループを使用した遅延、または NSTimer を使用した遅延は非常に不正確です。実行時に、コードが予想よりも 100 ミリ秒以上遅れて実行される可能性があります。

したがって、精度が高いにもかかわらず、精度が大幅に不足する可能性があります。

この正確なタイミングが必要な理由によっては、計算を修正して、違いを意味のないものにすることができる場合があります。

于 2009-12-08T04:53:13.030 に答える
0

コメントを追加するだけの十分な担当者がいませんが、myDelay を float に変換する場合は、100.0 で割ることを確認してください。そうしないと、期待どおりの結果が得られません。

于 2009-12-08T01:09:10.337 に答える