0

デリゲートがどのように機能するかについての質問です。

編集:

私はあなたを混乱させたかもしれないので、ここに私のアプリの構造があります。

いくつかのデリゲート機能を持つ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 内で追加の処理を実行しているためです。それとも同じですか?

デリゲート メソッドが呼び出されると、それが呼び出された場所はストールして完了を待つか、デリゲート メソッドとは独立して継続して実行しますか? (たとえば、別のスレッドに割り当てられている可能性があるため、停止しないことを念頭に置いています-したがって、更新はカスタム関数が終了するのを待ちませんが、場所の更新を取得し続けます)。

手伝って頂けますか?

4

2 に答える 2

1

デリゲート メソッドの呼び出しは、他のメソッドの呼び出しと同じです。メソッドを呼び出したスレッドは、そのメソッドが実行されるスレッドです。

そうは言っても、あらゆる種類の UI の更新 (ラベルについて言及しました)は、メイン スレッドで実行する必要があります。そうしないと、奇妙な結果が表示されます

編集:

これは、スレッド間の委譲を扱う場合の一般的なパターンです。

- (void)main {

    // This is running some code on a background thread.

    dispatch_async(dispatch_get_main_queue(), ^{

        // This is the main thread. Notify the delegate here.

        if ([delegate respondsToSelector:@selector(finishedDoingBackgroundWork)]) {

            [delegate finishedDoingBackgroundWork];
        }
    });
}
于 2013-09-13T20:47:53.113 に答える