我是iOS开发人员的新手。我一直试图找到答案,但没有明确的解决方案..
我有一个名为FirstView.m的视图
还有AppDelegate.m
后台任务正在AppDelegate.m中运行,该任务根据距离手机最近的信标更新名为“text”的变量。
当应用程序在FirstView中时,我想根据AppDelegate的变量文本更新FirstView内的UILabel。
我知道这可以通过在FirstView中运行后台线程来完成,每1秒检查AppDelegate中的变量是否被更改,但这对我来说似乎没有效果,没有必要运行两个后台同一任务的线程。
我的问题是,有没有办法从AppDelegate本身更新标签? performSelectorOnMainThread上的东西?
谢谢!
答案 0 :(得分:0)
只要值发生变化,您就可以在AppDelegate的userInfo字典中发布带有文本的通知:
text = [iBeacon updateText]; // just a random method name I made up
[[NSNotificationCenter defaultCenter] postNotificationName:@"textChanged"
object:self
userInfo:@{@"text":text}];
然后在FirstView中,您可以收听该通知以更新UI(通常位于viewDidLoad
或viewDidAppear:
)。确保在视图控制器在FirstView中的某处释放之前取消注册,这样就没有内存泄漏。注册和更新UI的示例
您可以这样注册:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleTextChanged:)
name:@"textChanged"
object:nil];
然后更新UI:
- (void)handleTextChanged:(NSNotification *)notification
{
// Be sure to update the UI on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
self.label.text = notification.userInfo[@"text"];
});
}
最后,取消注册通知:
[[NSNotificationCenter defaultCenter] removeObserver:self];
答案 1 :(得分:0)
您还可以使用keyValue Observing
尝试相同的方法。请参阅此Apple Documentation和how to implement the same.