Ios 岩心定位延迟

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

我已经为我的位置需求创建了一个助手类,这样我就不会违反DRY原则。该类如下所示:
位置.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..
   });
}];