// // LocationTool.m // 帅哥_团购 // // Created by beyond on 14-8-22. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import "LocationTool.h" #import <CoreLocation/CoreLocation.h> #import "City.h" #import "MetaDataTool.h" @interface LocationTool () <CLLocationManagerDelegate> { // 定位管理器,作用是:定位当前用户的经度和纬度 CLLocationManager *_mgr; // 地理位置解码编码器 CLGeocoder *_geo; } @end @implementation LocationTool singleton_implementation(LocationTool) // 工具类初始化时,创建 定位管理器、地理位置解码编码器,并设置代理为当前工具类 - (id)init { if (self = [super init]) { // 定位管理器 _mgr = [[CLLocationManager alloc] init]; // 当它定位完成,获得用户的经度和纬度时,会通知代理 _mgr.delegate = self; // 定位管理器 开始更新位置 [_mgr startUpdatingLocation]; // CLGeocoder可以根据刚才定位管理器定出的 经度和纬度,解码出用户所在位置的城市名 _geo = [[CLGeocoder alloc] init]; } return self; } #pragma mark - 定位管理器 代理方法,定位完毕时侯调用--1------3 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { // 1.既然已经定位到了用户当前的经纬度了,那么可以让定位管理器 停止定位了 [_mgr stopUpdatingLocation]; // 2.然后,取出第一个位置,根据其经纬度,通过CLGeocoder反向解析,获得该位置所在的城市名称,转成城市对象,用工具保存 CLLocation *loc = locations[0]; // 3.CLGeocoder反向通过经纬度,获得城市名 [_geo reverseGeocodeLocation:loc completionHandler: ^(NSArray *placemarks, NSError *error) { // 从字典中取出 state---->某某市 CLPlacemark *place = placemarks[0]; NSString *cityName = place.addressDictionary[@"State"]; // 将最后一个字符【市】去掉,转成城市对应,用工具保存 cityName = [cityName substringToIndex:cityName.length - 1]; // 从工具的城市字典中,根据城市名,取出对应的城市对象 City *city = [MetaDataTool sharedMetaDataTool].allCitiesDict[cityName]; // 设置当前城市对象,内部会拦截setter操作,并发出通知 [MetaDataTool sharedMetaDataTool].currentCity = city; // 定位,并且解析完毕之后,用成员变量记住 _locationCity = city; // 为成员属性赋值,供发起GET请求时,提供经纬度参数用 _locationCity.position = loc.coordinate; }]; }
时间: 2024-10-14 10:15:48