Objective c 如何在操作期间更新NSTextField值?

Objective c 如何在操作期间更新NSTextField值?,objective-c,xcode,cocoa,Objective C,Xcode,Cocoa,我正在运行一个动作中的长任务,我想展示一下我的位置。为此,我创建了一个文本字段,并尝试使用setString值: [textField setStingValue: [NSSting stringWithFormat:@"%ld",currentValue]] 代码可以工作,但不幸的是,它不是在每次迭代后更新NSTextField,而是在整个操作完成后更新 我做错了什么?这是因为使用Cocoa框架的应用程序使用事件循环来执行操作,并且事件以完全串行的方式发生 事件基本上是框架设计者无法预测或发

我正在运行一个动作中的长任务,我想展示一下我的位置。为此,我创建了一个文本字段,并尝试使用setString值:

[textField setStingValue: [NSSting stringWithFormat:@"%ld",currentValue]]
代码可以工作,但不幸的是,它不是在每次迭代后更新NSTextField,而是在整个操作完成后更新


我做错了什么?

这是因为使用Cocoa框架的应用程序使用事件循环来执行操作,并且事件以完全串行的方式发生

事件基本上是框架设计者无法预测或发现以延迟方式运行很方便的任何类型的操作。由于您无法预测何时执行单击,因此需要将其视为事件;出于效率原因(因为如果不需要,您不想多次重新绘制组件),重新绘制操作也是事件

您的操作是响应用户事件(例如,单击按钮就是事件)而运行的,因此会阻止队列中等待的所有其他事件,直到完成为止。但是,组件将重新绘制以响应不同的框架触发事件,因此文本字段必须等到操作完成后才能重新绘制自身。这就是为什么不能从动作内部直观地更改文本字段的值


为了通知用户任务的进度,您需要在不同的线程上运行它。关于线程有很多要说的,所以您可能应该阅读一些关于线程的内容。我还确信,有很多例子说明了如何在后台线程中运行一个长操作,并在互联网上相应地更新Cocoa的UI。

这是因为使用Cocoa框架的应用程序使用事件循环来执行操作,并且事件以完全串行的方式发生

事件基本上是框架设计者无法预测或发现以延迟方式运行很方便的任何类型的操作。由于您无法预测何时执行单击,因此需要将其视为事件;出于效率原因(因为如果不需要,您不想多次重新绘制组件),重新绘制操作也是事件

您的操作是响应用户事件(例如,单击按钮就是事件)而运行的,因此会阻止队列中等待的所有其他事件,直到完成为止。但是,组件将重新绘制以响应不同的框架触发事件,因此文本字段必须等到操作完成后才能重新绘制自身。这就是为什么不能从动作内部直观地更改文本字段的值


为了通知用户任务的进度,您需要在不同的线程上运行它。关于线程有很多要说的,所以您可能应该阅读一些关于线程的内容。我还确信,有很多例子说明了如何在后台线程中运行一个长操作,并相应地更新互联网上Cocoa的UI。

当您单击UI组件,它进入操作块时,代码正在主线程上运行,与绘制UI的线程相同。如果您在该块中运行一个长时间运行的操作,它在您完成之前不会绘制,因为它正忙于执行您让它执行的任何操作—您劫持了绘制线程

正如其他地方所说,您需要生成另一个线程,然后让新线程执行长时间运行的操作,并偶尔发送消息让主线程更新UI

下一步,请阅读苹果的文档,具体如下:

+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument

请注意,线程是一个非常重要的领域,如果不小心的话,请准备好进行一些wierd行为

当您单击UI组件,它进入操作块时,代码正在主线程上运行,与绘制UI的线程相同。如果您在该块中运行一个长时间运行的操作,它在您完成之前不会绘制,因为它正忙于执行您让它执行的任何操作—您劫持了绘制线程

正如其他地方所说,您需要生成另一个线程,然后让新线程执行长时间运行的操作,并偶尔发送消息让主线程更新UI

下一步,请阅读苹果的文档,具体如下:

+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
请注意,线程是一个非常重要的领域,如果不小心的话,请准备好进行一些wierd行为