2

这部分是关于 iOS 中的 Google Maps SDK 的问题,尽管可能主要是关于 Objective-C 中的原子操作的问题。

在我的应用程序中,我希望在用户当前位置和选定目的地之间的地图上绘制 GMSPolyline。myLocation我可以使用a 上的属性检索用户的当前位置GMSMapView。根据以下文档myLocation

如果启用了我的位置,则显示绘制用户位置点的位置。

如果它被禁用,或者它被启用但没有可用的位置数据,这将为 nil。使用 KVO 可以观察到此属性。

我有代码来绘制采用以下形式的折线:

if (myMapView.myLocation) {
    // draw polyline between myMapView.myLocation and the selected destination
}

我担心的是,无论在检查if (myMapView.myLocation)和绘制折线之间的可能性有多大,如果位置在不合时宜的时刻丢失// draw polyline between myMapView.myLocation and the selected destinationmyMapView.myLocation可能会变成这样。nil

myMapView.myLocation所以我的问题是,在Objective-C中,有没有办法让我将不为零的检查包装起来,并将折线绘制到锁定访问的操作中myMapView.myLocation,因此在检查之后但在尝试之前不能更改它绘制折线。如果 Objective-C 确实提供了一种机制,那么如果 Google 库myLocation锁定时尝试更新,这会产生什么影响?更新是否只是排队,直到我完成绘制折线并释放锁定?

所以我想这主要是关于Objective-C中原子事务的问题,在谷歌地图库的背景下。

4

1 回答 1

1

我不知道专门针对Objective C,但是基于锁定其他语言,我认为您想要的只有与第三方库(即Google Maps)合作才能完成。

因此,例如,如果您myMapView.myLocation在使用它时以某种方式锁定,那么这只有在 Google Maps SDK 也承诺在修改它时使用与您正在使用的相同锁定对象来锁定它时才有效。由于myMapView.myLocationcan be nil,这不太可能起作用,因为您不能使用nil对象作为锁定的“钥匙”。

类似地,如果您可以锁定整个GMSMapView,这样在持有锁时它的任何属性都不会更改,这只有在 Google Maps SDK 承诺在进行任何修改之前采用相同的锁时才有效。

一般来说,锁定第三方库中的任意对象可能不是一个好主意,因为这可能会干扰该库自己的同步(除非该库明确将其作为其接口的一部分提供)。反之亦然,在编写供第三方使用的库时,最好不要对库公开的对象实施内部锁定——相反,通常应该对内部对象实施锁定——以防图书馆的用户试图锁定公共对象。

但是,在您的情况下,您可以通过执行以下操作来避免该问题:

CLLocation* location = myMapView.myLocation;
if (location) 
{
    // draw polyline between location and the selected destination
}

这样,即使地图视图将其.myLocation属性设置为nil介于您的检查和绘制之间,您仍然会有对 的引用CLLocation,它不能设置为nil.

请注意,尽管文档说:

GMSMapView 只能从主线程读取和修改,类似于所有 UIKit 对象。从另一个线程调用这些方法将导致异常或未定义的行为。

似乎很可能GMSMapView会遵守相同的要求,因此只能从主线程修改其公共属性。因此,如果您的代码在主线程中运行(它必须这样做),则地图视图的属性不太可能在您的代码运行过程中发生变化。

于 2013-05-20T06:54:48.497 回答