求助:ios多线程处理定位问题

时间:2021-11-09 14:30:15
第一个问题:使用Core Locatin框架时,有时UI会卡住,请问是网络问题吗?定位时是异步的吗?
由于不知道是否异步,所以用了多线程,代码如下:
dispatch_queue_t where = dispatch_queue_create("where", nil);
dispatch_async(where, ^{
         _whereAmI = [[WhereAmI alloc] init];//进入定位,启动定位代码在init中
        //下面是注线程,刷新UI的
dispatch_async(dispatch_get_main_queue(), ^{
        ModifyViewController *modifyViewController = [[ModifyViewController alloc] init];
        modifyViewController.ispushed = YES;
        [STHUnity sthPushViewController:self viewController:modifyViewController];  
         });
 });

第二个问题:第一次使用GCD,不知用对否?给个说明。因为我用上面的代码,定位一直启动不了,当把GCD的几句代码去掉后,能启动定位,但是那样就回到第一个问题了,求解!!!

9 个解决方案

#1


gcd就是这么用的,定位启动不了。你凭什么判断定位没启动的呢?如果确实没启动,可以把init的代码贴上来。主线程刷新ui的代码看不懂你那是在干什么。

#2


我的UI刷新是没有问题的,全部封装在类里面,因此,在这个地方看不见。init中就是对LocationManager的设置。代码如下:
- (id)init
{
    self = [super init];
    if (self) {
        _locationManager = [[CLLocationManager alloc] init];
        _locationManager.delegate = self;
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        [_locationManager startUpdatingLocation];
    }
    return self;
}
注:如果取消GCD,直接把init放在主线程中,定位是可以启动的

#3


为什么判断没启动定位呢?当然一个是iphone定位时有个紫色箭头,还有我的定位方法里,会打印东西的,可以看出。调试的时候发现代码执行了[locationManager startUpdatingLocation];但是没有效果。

#4


定位是异步回调方式,GCD是在辅线程做延迟操作,在主线程做办面更新。
定位为异步回调方式,所以直接放主线程启动即可。
这里完成不需要使用GCD来处理。

#5


你说的我也测试了,就是网络不好的时候吧,定位会导致UI刷新卡,所以才放到GCD里的,其实我是想把定位放在程序启动时,但是那样浪费资源啊

#6


定位本身是异步的,应该不会卡住UI, 除非你在收到位置信息时搞了很大的动作

#7


启动定位的代码也没问题。你确定你允许了这个应用定位?另外楼上说的也是对的,定位本来是个异步回调的。没必要放在后台去启动。也许你放到后台去 启动,ios认为你在干坏事,没启动定位。只要你在定位的异步回调函数里面控制好ui就不会卡了。(把操作ui的都放到主线程里面去)

#8


我在处理位置信息的时候,没用苹果的经纬度解析,直接用的是谷歌的API,需要网络访问HTTP,来得到具体的地址信息,因为返回的是json数据,而且层数很多,所以处理数据这里应该占了很大内存

#9


谢谢大家哈

#1


gcd就是这么用的,定位启动不了。你凭什么判断定位没启动的呢?如果确实没启动,可以把init的代码贴上来。主线程刷新ui的代码看不懂你那是在干什么。

#2


我的UI刷新是没有问题的,全部封装在类里面,因此,在这个地方看不见。init中就是对LocationManager的设置。代码如下:
- (id)init
{
    self = [super init];
    if (self) {
        _locationManager = [[CLLocationManager alloc] init];
        _locationManager.delegate = self;
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        [_locationManager startUpdatingLocation];
    }
    return self;
}
注:如果取消GCD,直接把init放在主线程中,定位是可以启动的

#3


为什么判断没启动定位呢?当然一个是iphone定位时有个紫色箭头,还有我的定位方法里,会打印东西的,可以看出。调试的时候发现代码执行了[locationManager startUpdatingLocation];但是没有效果。

#4


定位是异步回调方式,GCD是在辅线程做延迟操作,在主线程做办面更新。
定位为异步回调方式,所以直接放主线程启动即可。
这里完成不需要使用GCD来处理。

#5


你说的我也测试了,就是网络不好的时候吧,定位会导致UI刷新卡,所以才放到GCD里的,其实我是想把定位放在程序启动时,但是那样浪费资源啊

#6


定位本身是异步的,应该不会卡住UI, 除非你在收到位置信息时搞了很大的动作

#7


启动定位的代码也没问题。你确定你允许了这个应用定位?另外楼上说的也是对的,定位本来是个异步回调的。没必要放在后台去启动。也许你放到后台去 启动,ios认为你在干坏事,没启动定位。只要你在定位的异步回调函数里面控制好ui就不会卡了。(把操作ui的都放到主线程里面去)

#8


我在处理位置信息的时候,没用苹果的经纬度解析,直接用的是谷歌的API,需要网络访问HTTP,来得到具体的地址信息,因为返回的是json数据,而且层数很多,所以处理数据这里应该占了很大内存

#9


谢谢大家哈