iOS视图控制器生命周期

时间:2013-02-06 08:37:37

标签: ios grand-central-dispatch lifecycle viewcontroller

我在基于地图的应用程序中遇到了一些奇怪的行为。我正在获取一些数据来显示使用某些路线服务的路线。它使用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没有被销毁但是如果我重新进入它会创建一个新的。是否可以从RootViewController确定目标视图控制器的实例是否存在并使用它执行Segue?

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

感谢您的任何想法

2 个答案:

答案 0 :(得分:1)

如果我理解你写的是什么,你每次“输入”时都会创建一个新的控制器,但是调度块总是引用你创建的第一个控制块,所以显示新的控制器但是旧的控制器会收到通知。 。 有很多方法可以避免这种情况,取决于你的实现,但一个简单的解决方案可能是在根视图控制器的属性中保持对地图视图控制器的(强)引用:如果它是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...

希望这个帮助

答案 1 :(得分: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..