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 秒,但出现了同样的问题。-> 按钮看起来像永久按下,根本没有显示任何信息。

我怎样才能解决这个问题 - 我怎样才能让它像流一样工作?

Greetz Shaddy

4

1 回答 1

0

usleep 正在阻塞并在此间隔内停止代码的执行。

要每秒刷新一次数据,NSTimer请使用该方法实例化 an+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"];

然后将请求代码移至方法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 回答