iPhone:当我做一些沉重的事情时屏幕没有重绘_afterwards_

时间:2010-12-01 10:25:43

标签: iphone objective-c

我想在Twitter上发布消息和图片(使用图片主持人)。如果用户单独输入消息然后点击发送我的叠加层,则显示“向Twitter发送消息”。 如果用户添加图片,则不显示该叠加。也许是因为他必须把它转换成jpg而那是重负荷? 我的代码如下所示:

[overlayMessage changeTextTo:NSLocalizedString(@"keySendTwitter", nil)];
overlayMessage.hidden = NO; 
overlayMessage.locked = YES;

// I've added these out of desperation :P
[overlayMessage setNeedsDisplay];
[self.view setNeedsDisplay];

[self sendMessage];

似乎两条消息(changeTextTo:和sendMessage :)并行运行,并且sendMessage在执行繁重加载时速度稍快一些。但这需要线程化,我的应用程序不是多线程的。

或者setNeedsDisplay:在重载之前更新屏幕是错误的消息吗?

1 个答案:

答案 0 :(得分:1)

不是100%清楚你正在做什么,但听起来你的[self sendMessage]方法阻止了UI的更新。如果您正在进行大型同步网络操作或图像转换,这是有意义的。您不必过多地使用线程来使UI在繁重的操作中响应。只需使用以下命令在另一个线程上调用sendMessage

[self performSelector@selector(sendMessage) withObject:nil afterDelay:0.001f];

[self performSelectorInBackground:@selector(sendMessage) withObject:nil];

您的方法将结束,您的用户界面将更新(可能不需要setNeedsDisplay),您的sendMessage选择器将会触发。您负责确保sendMessage导致您的加载屏幕被解除,但您会想到一些事情:)

这里的关键思想是接口更新是批量发生的。一些代码运行,然后接口更新......代码的另一部分运行,接口更新。

这里发生的事情是你的代码太笨重了,ui在完成之前无法更新。调用setNeedsDisplay仅将视图标记为“脏”并且需要重绘,它实际上不会重新绘制视图。

我建议您将操作分解为异步块,使用NSOperationQueue或使用其中一个performSelector变体。