首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >刷新UITextView

刷新UITextView
EN

Stack Overflow用户
提问于 2012-08-28 06:36:23
回答 1查看 4.6K关注 0票数 2

我想在UITextview中写一些日志文本。例如:加载X图像,创建y对象等。我的问题是:插入一行后,UITextView不会刷新。我认为当插入结束时,所有新文本都会同时显示。

代码语言:javascript
复制
append = [@"" stringByAppendingFormat:@"\n%@ file is dowloading...", refreshName]
logTextView.text = [logTextView.text stringByAppendingString: append];

下载后,我保存文件

代码语言:javascript
复制
append = [@"" stringByAppendingFormat:@"\n%@ file saved", refreshName];
logTextView.text = [logTextView.text stringByAppendingString: append];

我试过了

代码语言:javascript
复制
[logTextView setNeedsDisplay]

代码语言:javascript
复制
[logTextView performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES];

但没有用:

会议将是:

  1. 在textview中插入新行(下载)
  2. 显示这段文字
  3. 下载文件(几秒钟)
  4. 向UITextView插入新行(下载完成)
  5. 显示文本

发生的情况是:

  1. 下载文件(几秒钟)
  2. UITextView显示行(下载完毕)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-28 12:54:04

文本将只在下一次通过主线程的运行循环进行更新。如果主循环上有一个长时间运行的任务,并且它一直在写入textView,那么在任务结束之前不会显示任何内容。

我可以想出几种方法来解决这个问题:

  • 在常规调度队列上运行大任务,并使用textView (dispatch_get_main_queue())返回消息(dispatch_get_main_queue(),追加此新文本);其思想是您的任务是在辅助线程上执行(因此它不能直接发送UI消息),而是通过向主队列发送短块来更新UI。
  • 把你的大任务分成几个块,每个任务都可以通过一个方法来启动。在本例中,您在主队列上执行第一个任务,然后使用更新的UITextView文本向主队列分配一个块,然后再执行下一个要完成的工作。这就是: dispatch_async(dispatch_get_main_queue(),^{更新textView文本;self doTask1 1:MaybeSomeDicary;}

当doTask1完成时,它会分发下一个块:

代码语言:javascript
复制
dispatch_async(dispatch_get_main_queue(), ^
{
    update textView text again;
    [self doTask2:maybeSomeDictionary];
}

当最后的任务完成后,你就完成了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12153939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档