2

マップベースのアプリで奇妙な動作に直面しています。いくつかのルートサービスを使用してルートを表示するためにいくつかのデータをフェッチしています。GCDを使用してバックグラウンドスレッドで実行されます。フェッチされたデータを使用して、メインスレッドに戻り、UIを更新します。

 dispatch_async(dispatch_get_main_queue(), ^{
            [self.mapProvider addToExistingPolyLinePoints:coordinates withTitle:@"line" removeOldOne:NO useCurrentIndex:NO];

            [_distanceLabel setText:[NSString stringWithFormat:@"%.2lf km",[self.draggingLogic getOverallDistance]]];
            [self.progress setHidden:YES];
        });

これはすべて私のRouteViewControllerで正常に機能します。しかし、戻るボタンを使用してRootViewControllerに戻り、RouteViewControllerを再入力してすべてを再フェッチすると、UIは評価されません。これは、UIの更新がメインスレッドで行われていない場合と同じ動作を示します。データは正しく到着します。

完全には理解できなかったiOSのViewControllerのライフサイクルに何か問題があるのではないかと思います。戻るボタンを押すとどうなりますか。明らかに、ViewControllerは破棄されませんが、再入力すると新しいものが作成されます。RootViewControllerから、ターゲットView Controllerのインスタンスが存在するかどうかを判断し、それを使用してSegueを実行することは可能ですか?

とにかく、これが私の問題に関するものかどうかはわかりません。

アイデアをありがとう

4

2 に答える 2

1

あなたが書いた内容を正しく理解していれば、「入る」たびに新しいコントローラーを作成しますが、ディスパッチブロックは常に最初に作成したコントローラーを参照するため、新しいコントローラーは表示されますが、古いコントローラーは通知を受け取ります...これを回避する方法は多く、実装によって異なりますが、簡単な解決策は、ルートビューコントローラーのプロパティにマップビューコントローラーへの(強力な)参照を保持することです。nilの場合(初めて)、マップコントローラーを作成します。必要なすべてのことを行います。そうしないと、作成部分なしで、単にそれを表示します。

.hのサンプルコード:

@property (strong,nonatomic) MyMapController* mapController;

.mで:

if (!self.mapController)
{
    // create the controller and the update handler...
    self.mapController = ... //created object
}

// show it and everything...

この助けを願っています

于 2013-02-06T09:39:43.163 に答える
0
You are needed to do the stuff given here....   
you create a new controller every time you "enter" but the dispatching block always refer to the first one you create, so the new one is displayed but the old one get the notifications... 

Ex-code, in Interface file :

@property (strong,nonatomic) MyMapProvider* mapProvider;

And in implementation file :

if (!self.mapProvider)
{
    self.mapProvider = ... //create object
}

// do your stuff..
于 2014-10-14T10:19:31.960 に答える