1

---私の Xcode-ViewController.h は次のとおりです。

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController{

    IBOutlet UILabel *Anzeige;
    IBOutlet UIScrollView *scrollAnzeige;
}

-(IBAction)StartButton:(id)sender;

@end

---私のXcode-ViewController.mは次のとおりです(私が作成/編集したもの):

-(IBAction)StartButton:(id)sender{

    NSString *hostSTR = @"http://localhost/iphoneconnect.php";

    NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:hostSTR]];

    NSString *serverOutput = [[NSString alloc] initWithData:dataURL encoding:NSASCIIStringEncoding];

    NSString *finalString = @"";

    finalString = [serverOutput  stringByReplacingOccurrencesOfString:@"#" withString:@"\n"];

    Anzeige.text = finalString;

}

- (void)viewDidLoad
{
    [scrollAnzeige setScrollEnabled:YES];
    [scrollAnzeige setContentSize:CGSizeMake(614, 730)];//614 breit


    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

---私のPHPコードは次のとおりです。

<?

session_start();

$connect = mysql_connect("my.server.com", "user" , "pass") 
or die("Verbindung zur Datenbank konnte nicht hergestellt werden"); 

mysql_select_db("database") or die ("Datenbank konnte nicht ausgewählt werden"); 

$q = mysql_query("SELECT * FROM table");

while($x = mysql_fetch_assoc($q))
{
        echo $x['coloumn1']." ".$x['coloumn2']." ".$x['coloumn3']." ".$x['coloumn4']." ".$x['coloumn5']." ".$x['coloumn6']." ".$x['coloumn7']." ".$x['coloumn8']." ".$x['coloumn9']." ".$x['coloumn10']." ".$x['coloumn11']." ".$x['coloumn12']."#";
}

mysql_close($connect);

?>

これはすべて機能しています - データベースから情報をダウンロードして表示しています。私が実現したい最も重要なことは、情報が毎秒更新されていることです(またはより長い遅延 - 何が可能かによって異なります)。

usleep(1000) を使用しましたが、シミュレーターのボタンが押しっぱなしの状態で、情報がまったく表示されませんでした。

その後、5 秒などのより高い遅延を使用しようとしましたが、同じ問題が発生しました。-> ボタンが押しっぱなしのように見え、情報がまったく表示されませんでした。

この問題を解決するにはどうすればよいですか - どうすればストリームのように動作させることができますか?

グリーツ・シャディ

4

1 に答える 1

0

usleep はブロックしており、その間隔でコードの実行を停止します。

1 秒に 1 回データを更新するにはNSTimer、 メソッドで をインスタンス化し、+timerWithTimeInterval:target:selector:userInfo:repeats:それをメインの実行ループに追加します。

NSTimer *timer = [NSTimer timerWithTimeInterval:1.0f
              target:self
              selector:@selector(refreshData:)
              userInfo:nil
              repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:@"NSDefaultRunLoopMode"];

次に、リクエスト コードを method に移動しますrefreshData:(NSTimer*)timer。タイマーを停止するには、 を呼び出す必要があります[timer invalidate]

したがって、上記のコードが機能する場合は、次のようにして目的の効果が得られるはずです。

-(void)refreshData:(NSTimer*)timer
{
    NSString *hostSTR = @"http://localhost/iphoneconnect.php";

    NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:hostSTR]];

    NSString *serverOutput = [[NSString alloc] initWithData:dataURL encoding:NSASCIIStringEncoding];

    NSString *finalString = @"";

    finalString = [serverOutput  stringByReplacingOccurrencesOfString:@"#" withString:@"\n"];

    Anzeige.text = finalString;

}


-(IBAction)StartButton:(id)sender
{
    UIButton* button = (UIButton*)sender;
    if (!timer){
        timer = [NSTimer timerWithTimeInterval:1.0f
                                                 target:self
                                               selector:@selector(refreshData:)
                                               userInfo:nil
                                                repeats:YES];
        [[NSRunLoop mainRunLoop] addTimer:timer forMode:@"NSDefaultRunLoopMode"];
        [button setTitle:@"Stop" forState:UIControlStateNormal];
    }else{
        [timer invalidate];
        timer = nil;
        [button setTitle:@"Start" forState:UIControlStateNormal];
    }
}

NSTimer *timer;インターフェイスに追加することを忘れないでください。

ベスト、ピーター

于 2012-09-06T12:59:04.203 に答える