我想在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:在重载之前更新屏幕是错误的消息吗?
答案 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
变体。