//
// 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;
}];
}
iOS_21团购_定位并根据经纬度,解析出城市名