在“while循环”中更新UILabel

时间:2012-05-02 09:27:36

标签: objective-c ios while-loop uilabel

我正在尝试更新“while循环”中的UILabel,但它没有更改UILabel文本。我知道它在iOS的主线程的当前运行循环周期结束时显示。但是如何解决这个问题(ftp.AsyncFinished函数由外部chilkat ftp模块提供):

数据每秒更新一次。我搜索了这个论坛和Apple的文档,但是我无法找到在主线程上更新“while循环”中UILabel的正确方法。我可以使用什么代替while循环,它允许主线程更新UILabel

while (ftp.AsyncFinished != YES) {
    // here is the code getting data from the cilkat FTP module stored in PercentOfFile and MinutesRemaining
    NSString *content =[[NSString alloc] initWithFormat:@"%.0f%% done%.0fmin left",PercentOfFile,MinutesRemaining ];
    [LabelProgress setText:content];
}

4 个答案:

答案 0 :(得分:4)

为了让UI完全更新,主线程的运行循环必须完成。这意味着您的方法(如果在主线程上调用)必须在任何UI更新发生之前返回。然后合并所有更新并重新绘制UI。

有关更多背景信息,请参阅What is the most robust way to force a UIView to redraw?

您的while循环设计不正确,无法进行异步更新。您不应该在while循环中获取异步数据。您应该注册某种回调(通常将自己设置为delegate),然后等待系统给您打电话。

答案 1 :(得分:1)

您需要在另一个主题中调用上传进度并注册回拨。创建一个继承自CkoFTP2Progress的自定义类,该类具有以下方法:

- (void)PercentDone: (NSNumber *)pctDone abort:(BOOL *)abort;

假设您有一个名为“ftp”的CkoFTp2对象和名为“UploadProgress”的自定义类,请注册回调:

[self.ftp setEventCallbackObject:self.uploadProgress];

答案 2 :(得分:0)

您可以将while循环移动到后台线程,并使用performSelectorOnMainThread从那里调用setText。

答案 3 :(得分:0)

// update your UILabel here
// ...

// Delay execution of long-running task so that update of UILabel can be performed
dispatch_after( dispatch_time( DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC ), dispatch_get_main_queue(), ^{
     // long-running task 
     // ..
});