デリゲートがどのように機能するかについての質問です。
編集:
私はあなたを混乱させたかもしれないので、ここに私のアプリの構造があります。
いくつかのデリゲート機能を持つLocationManager 。
このクラスは、次のようないくつかのデリゲート メソッドを定義します。
@protocol LocationManagerDelegate <NSObject>
@optional
- (void)locationManager:(LocationManager *)locationManager distanceUpdated:(CLLocationDistance)distance;
@end
私のMainViewControllerは LocationManager をインスタンス化し、デリゲートの機能を実装します。
[LocationManager sharedLocationManager].delegate = self;
したがって、LocationManager 内には次の関数があります。
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
その中でカスタム関数 f1 と次のようなデリゲート関数を呼び出しています。
[self.delegate locationManager:self distanceUpdated:self.totalDistance];
MainViewController に実装されたデリゲート関数のコードは次のとおりです。
- (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();
}
mainViewControllerで
- (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];
...
}
mainViewControllerで
- (void)locationManager:(PSLocationManager *)locationManager distanceUpdated:(CLLocationDistance)distance {
self.totalDistanceCovered.text= [NSString stringWithFormat:@"%.2f %@", distance, NSLocalizedString(@"meters", @"")];
f1();
}
それとも完全に同一ですか?
つまり、デリゲート メソッドとして実装され、実際のコードは mainViewController にあるということです。(ロジックを didUpdate の外に移動し、mainViewController に入れます)それは良いですか? 現在、didUpdate 内で追加の処理を実行しているためです。それとも同じですか?
デリゲート メソッドが呼び出されると、それが呼び出された場所はストールして完了を待つか、デリゲート メソッドとは独立して継続して実行しますか? (たとえば、別のスレッドに割り当てられている可能性があるため、停止しないことを念頭に置いています-したがって、更新はカスタム関数が終了するのを待ちませんが、場所の更新を取得し続けます)。
手伝って頂けますか?