我正在尝试更新“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];
}
答案 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
// ..
});