Ios 岩心定位延迟
我已经为我的位置需求创建了一个助手类,这样我就不会违反DRY原则。该类如下所示:Ios 岩心定位延迟,ios,objective-c,location,cllocationmanager,Ios,Objective C,Location,Cllocationmanager,我已经为我的位置需求创建了一个助手类,这样我就不会违反DRY原则。该类如下所示: 位置.h 当我在ViewController中尝试创建位置实例并设置纬度和经度标签时,在viewDidLoad方法中,标签设置为0.00000。 显然,定位需要大约半秒钟的时间才能得到坐标。 我试过使用 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ [s
位置.h 当我在ViewController中尝试创建位置实例并设置纬度和经度标签时,在viewDidLoad方法中,标签设置为0.00000。 显然,定位需要大约半秒钟的时间才能得到坐标。 我试过使用
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self setCoordinateLabels];
});
但这似乎很老套,不可能是最好的做法吗?那么,我有没有更好的方法来做这件事呢?好吧,这很难理解。为什么不转发委托方法调用
locationManager:didUpdateToLocation:
(顺便说一句,这是一个遗留功能)
告诉您何时设置第一个位置。您只需在位置
类上设置一个代理数组,并在适当的时候调用每个代理即可
下面是一个带有块的示例:
static NSMapTable *listenerBlocks;
+ (void)addListener:(NSObject *)listener listenerBlock:(void (^)())listenerBlock
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
listenerBlocks =
[NSMapTable mapTableWithKeyOptions:NSMapTableWeakMemory
valueOptions:NSMapTableStrongMemory];
});
if (listenerBlock && listener) {
[listenerBlocks setObject:listenerBlock forKey:listener];
}
}
+ (void)removeListener:(NSObject *)listener
{
if (listener) {
[listenerBlocks removeObjectForKey:listener];
}
}
在您的locationManager:didUpdateToLocation:
中,您只需调用
NSArray *allBlocks = [[listenerBlocks objectEnumerator] allObjects];
for(void (^listenerBlock)(NSString *) in allBlocks)
{
listenerBlock();
}
最后
在需要更新标签的类中(例如myLabel
):
感谢您的快速响应!:)我从未见过关于NSMapTable的任何东西。因此,第一个代码示例(静态NSMapTable*listenerBlocks)位于location.m文件中,然后我使用UpdateToLocation(仍然位于location.m right?)获取代码的第二部分。使用“eventName”调用哪种方法?我要在那里贴标签吗?或者什么?忘了eventName吧-我更新代码exampe时没有它,你不需要它。复制我编辑的代码!我还添加了一个使用示例,在这个示例中,您可以更新您的标签。您需要NSMapTable来实现比NSDictionary更好的内存管理,但基本相同。听众不会被保留!
static NSMapTable *listenerBlocks;
+ (void)addListener:(NSObject *)listener listenerBlock:(void (^)())listenerBlock
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
listenerBlocks =
[NSMapTable mapTableWithKeyOptions:NSMapTableWeakMemory
valueOptions:NSMapTableStrongMemory];
});
if (listenerBlock && listener) {
[listenerBlocks setObject:listenerBlock forKey:listener];
}
}
+ (void)removeListener:(NSObject *)listener
{
if (listener) {
[listenerBlocks removeObjectForKey:listener];
}
}
NSArray *allBlocks = [[listenerBlocks objectEnumerator] allObjects];
for(void (^listenerBlock)(NSString *) in allBlocks)
{
listenerBlock();
}
[Location addListener:self listenerBlock:^{
dispatch_async(dispatch_get_main_queue(),^{
//myLabel.text = //... update your label here
[self setCoordinateLabels]; // as from your code above..
});
}];