第一个问题:使用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的几句代码去掉后,能启动定位,但是那样就回到第一个问题了,求解!!!

解决方案 »

  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.   

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

  7.   

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