iOS视图控制器生命周期

iOS视图控制器生命周期,ios,grand-central-dispatch,lifecycle,viewcontroller,Ios,Grand Central Dispatch,Lifecycle,Viewcontroller,我在基于地图的应用程序中遇到了一些奇怪的行为。我正在获取一些数据,以显示使用某些方向服务的路线。它使用GCD在后台线程中运行。获取数据后,我返回主线程以更新UI: dispatch_async(dispatch_get_main_queue(), ^{ [self.mapProvider addToExistingPolyLinePoints:coordinates withTitle:@"line" removeOldOne:NO useCurrentIndex:NO

我在基于地图的应用程序中遇到了一些奇怪的行为。我正在获取一些数据,以显示使用某些方向服务的路线。它使用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];
        });
这一切在我的RouteView控制器中运行良好。但是如果我使用back按钮返回RootViewController并重新输入RouteViewController并重新蚀刻整个内容,UI将不会得到评估。它显示与未在主线程中完成UI更新相同的行为。数据准确无误

我想知道这是否是关于iOS的视图控制器生命周期的某种问题,我没有完全了解。当我按下后退按钮时会发生什么。显然,ViewController没有被销毁,但如果我重新输入,它将创建一个新的。是否可以从RootViewController确定目标视图控制器的实例是否存在并使用它执行Segue

无论如何,我不确定这是否与我的问题有关


谢谢你的任何想法

如果我正确理解你写的内容,每次“进入”时你都会创建一个新的控制器,但调度块总是指你创建的第一个控制器,因此会显示新的控制器,但旧的控制器会收到通知。。。 有很多方法可以避免这种情况,具体取决于您的实现,但一个简单的解决方案可能是在根视图控制器的属性中保留对地图视图控制器的(强)引用:如果是nil(第一次),则创建地图控制器并执行所有需要的操作,否则只显示它,而不显示创建部分

示例代码,在.h中:

@property (strong,nonatomic) MyMapController* mapController;
in.m:

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

// show it and everything...

希望这有助于

事实上,我已经有了这个引用来比较实例,但是我在按下视图控制器时没有使用它。谢谢你,哈哈。RouteViewController==“根”视图控制器?:D
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..