我正在开发一个将固件下载到设备的cocoa应用程序。使用NSProgressIndicator显示下载进度。我在while循环中调用DeviceRequestTO方法后调用NSProgressIndicator的-incrementBy:
方法。但只有在将整个固件写入设备后才会更新进度指示器。它显示100%完成一次。所以我添加了NSView类的-displayIfNeeded
方法。现在它可以顺利显示进度,但这也会在固件下载完成后发生。如何同时实现进度指示和写入操作?
以下是代码:
while(1)
{
int result = (*dev)->DeviceRequestTO(dev, &request);
printf("\nBlocks Written Successfully: %d",DfuBlockCnt);
[refToSelf performSelectorOnMainThread:@selector(notifyContent)
withObject:nil
waitUntilDone:NO];
}
//In main thread
- (void)notifyContent{
[dnldIndicator incrementBy:1];
[self displayIfNeeded];
}
答案 0 :(得分:5)
您需要调用的方法是setNeedsDisplay:
,而不是displayIfNeeded
。后者的意思是“如果有人发送给你display
,请发送给自己setNeedsDisplay:YES
”。如果你没有做最后一部分,那么视图就不知道它应该显示,displayIfNeeded
将什么都不做。
一旦你添加setNeedsDisplay:
消息,你就可以删除displayIfNeeded
消息,因为框架会定期将该消息发送到窗口(因此,它的所有视图)反正。
答案 1 :(得分:0)
您的代码看起来与我在Mac和iPhone上用于更新UIProgressIndicators和NSProgressIndicators的代码完全相同,代码对我来说非常适合。我假设,像menumachine一样,你的while循环存在于后台线程上(使用performSelectorInBackground创建:withObject:或NSThread的detachNewThreadSelector:toTarget:withObject:)。
进度指示器的minValue和maxValue是否设置正确(0和100或您的比例是多少)?
更新发生的频率如何?也许你发送太多事件太快,UI没有机会正确更新。
据我所知,这段代码应该可行。