gpt4 book ai didi

ios - 在 objC 的委托(delegate)方法中执行自定义函数的有效方法

转载 作者:行者123 更新时间:2023-11-28 22:26:34 25 4
gpt4 key购买 nike

只是关于委托(delegate)如何工作的问题。

编辑:

因为我可能让你感到困惑,这里是我的应用程序的结构。

LocationManager 具有一些委托(delegate)功能。

此类定义了一些委托(delegate)方法,例如:

@protocol LocationManagerDelegate <NSObject>

@optional
- (void)locationManager:(LocationManager *)locationManager distanceUpdated:(CLLocationDistance)distance;

@end

我的 MainViewController 实例化 LocationManager 并实现委托(delegate)的功能。

[LocationManager sharedLocationManager].delegate = self;

因此,在 LocationManager 中有函数:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

在其中我调用了一个自定义函数 f1 和一个委托(delegate)函数,如下所示:

        [self.delegate locationManager:self distanceUpdated:self.totalDistance];

在我的 MainViewController 中实现的委托(delegate)函数中的代码是这样的:

- (void)locationManager:(LocationManager *)locationManager distanceUpdated:(CLLocationDistance)distance {
self.totalDistanceCovered.text= [NSString stringWithFormat:@"%.2f %@", distance, NSLocalizedString(@"meters", @"")];
}

所以我的问题是:

哪个更有效并且不会阻塞我的应用程序?

这个解决方案:

LocationManager

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
...
[self.delegate locationManager:self distanceUpdated:self.totalDistance];
...
f1();
}

ma​​inViewController

- (void)locationManager:(PSLocationManager *)locationManager distanceUpdated:(CLLocationDistance)distance {
self.totalDistanceCovered.text= [NSString stringWithFormat:@"%.2f %@", distance, NSLocalizedString(@"meters", @"")];
}

LocationManager

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
...
[self.delegate locationManager:self distanceUpdated:self.totalDistance];
...
}

ma​​inViewController

- (void)locationManager:(PSLocationManager *)locationManager distanceUpdated:(CLLocationDistance)distance {
self.totalDistanceCovered.text= [NSString stringWithFormat:@"%.2f %@", distance, NSLocalizedString(@"meters", @"")];

f1();
}

还是它们完全相同?

我的意思是它将作为委托(delegate)方法实现,实际代码将在我的 mainViewController 中。 (将逻辑移到我的 didUpdate 之外 - 并将其放在我的 mainViewController 中)它更好吗?因为现在在我的 didUpdate 中我正在执行一些额外的事情。还是一样?

当调用委托(delegate)方法时,调用它的地方是停止并等待完成,还是继续运行并独立于委托(delegate)方法运行?(我在想它可能被分配给另一个线程,例如,所以它不会停止 - 因此我的更新不会等待我的自定义函数完成但它会继续获取位置更新)。

你能帮帮我吗?

最佳答案

当您提供委托(delegate)方法时,需要调用您的委托(delegate)的正在运行的线程将被阻塞,直到您的方法返回(假设它们没有专门实现异步回调调用)。

如果您的委托(delegate)方法更新了一个与 UI 相关的项目,就像您的那样,您就会遇到问题,因为与 UI 相关的项目必须在主线程上处理。

避免性能问题的方法是让您的委托(delegate)成为一个“模型”对象——而不是调用 UI 工具包的东西。你应该有一个单独的 NSNotification 监听器,比如 updateUIFromModel,只要你的模型更新到 UI 需要更新的程度,它就会发出信号。这个监听器应该从主线程调度,所以它只更新主线程上的 UI 相关项。当您的位置相关委托(delegate)被调用时,您可以发出通知让您的监听器获取并更新 UI。

关于ios - 在 objC 的委托(delegate)方法中执行自定义函数的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18794697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com