由于不知道是否异步,所以用了多线程,代码如下:
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放在主线程中,定位是可以启动的
- (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来处理。
定位为异步回调方式,所以直接放主线程启动即可。
这里完成不需要使用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放在主线程中,定位是可以启动的
- (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来处理。
定位为异步回调方式,所以直接放主线程启动即可。
这里完成不需要使用GCD来处理。
#5
你说的我也测试了,就是网络不好的时候吧,定位会导致UI刷新卡,所以才放到GCD里的,其实我是想把定位放在程序启动时,但是那样浪费资源啊
#6
定位本身是异步的,应该不会卡住UI, 除非你在收到位置信息时搞了很大的动作
#7
启动定位的代码也没问题。你确定你允许了这个应用定位?另外楼上说的也是对的,定位本来是个异步回调的。没必要放在后台去启动。也许你放到后台去 启动,ios认为你在干坏事,没启动定位。只要你在定位的异步回调函数里面控制好ui就不会卡了。(把操作ui的都放到主线程里面去)
#8
我在处理位置信息的时候,没用苹果的经纬度解析,直接用的是谷歌的API,需要网络访问HTTP,来得到具体的地址信息,因为返回的是json数据,而且层数很多,所以处理数据这里应该占了很大内存
#9
谢谢大家哈