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 没有被破坏,但如果我重新输入它会创建一个新的。是否可以从 RootViewController 确定目标视图控制器的实例是否存在并使用它执行 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 回答