需求:获取经纬度。

方案:我自定义了一个类模块CLLocationModule.swift

备注以下代码里

let IS_IOS8 = (UIDevice.currentDevice().systemVersion as NSString).doubleValue >= 8.0

最开始的代码

import UIKit

import CoreLocation

class CLLocationModule: NSObject ,CLLocationManagerDelegate{

var latitude:Double?

var longitude:Double?

var city:NSString?

func GetLatitudeLongitudeAndCity(){

if CLLocationManager.locationServicesEnabled() == false {

print("此设备不能定位")

return

}

var locManager = CLLocationManager()

locManager.delegate = self

locManager.desiredAccuracy = kCLLocationAccuracyBest

locManager.distanceFilter = 1000.0

//设置定位权限仅ios8有意义

if IS_IOS8 {

locManager.requestWhenInUseAuthorization()// 前台定位

locManager.requestAlwaysAuthorization()

}

locManager.startUpdatingLocation()

}

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

for location in locations {

print("纬度:%g",location.coordinate.latitude);

print("经度:%g",location.coordinate.longitude);

latitude = location.coordinate.latitude

longitude = location.coordinate.longitude

self.saveLatitude(latitude!.description)

self.saveLongitude(longitude!.description)

let geocoder: CLGeocoder = CLGeocoder()

geocoder.reverseGeocodeLocation(location) { (placemarks, error) in

if error != nil {

print("reverse geodcode fail: \(error!.localizedDescription)")

return

}

let pm = placemarks! as [CLPlacemark]

if (pm.count > 0){

for placemark :CLPlacemark in placemarks! {

let placemarkDict = placemark.addressDictionary

let placemarkStr = placemarkDict!["State"]

self.city = placemarkStr?.substringToIndex((placemarkStr?.length)!-1)

self.saveCity(self.city!)

}

}else{

print("No Placemarks!")

}

}

}

manager.stopUpdatingLocation()

}

func locationManager(manager:CLLocationManager, didFailWithError error:NSError) {

print("locationManager error");

}

func saveLatitude(latitude: NSString) {

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

defaults.setObject(latitude, forKey: "latitude")

defaults.synchronize()

}

func readLatitude() -> NSString {

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

let latitude = defaults.objectForKey("latitude") as! NSString

return latitude;

}

func saveLongitude(longitude: NSString) {

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

defaults.setObject(longitude, forKey: "longitude")

defaults.synchronize()

}

func readLongitude() -> NSString {

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

let longitude = defaults.objectForKey("longitude") as! NSString

return longitude;

}

func saveCity(city: NSString) {

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

defaults.setObject(city, forKey: "city")

defaults.synchronize()

}

func readCity() -> NSString {

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

let city = defaults.objectForKey("city") as! NSString

return city;

}

}

外部调用是:

CLLocationModule().GetLatitudeLongitudeAndCity()

结果:定位框一闪而过 (允许 不允许那个弹出框) 导致不走代理方法didUpdateLocations 最后查阅网页 知道

(a)locManager没定义为全局变量

(b)自定义的CLLocationModule.swift这个类 由于ARC的缘故 自动释放了

针对以上(a)问题的解决办法为自定义类CLLocationModule.swift中将var locManager = CLLocationManager() 改为全局变量

var locManager: CLLocationManager!

locManager = CLLocationManager()

针对以上(b)问题的解决方案有两种

(1)外部调用时改为:(改为强引用)

var aCLLocationModule = CLLocationModule()

self.aCLLocationModule.GetLatitudeLongitudeAndCity()

(2)自定义的类CLLocationModule.swift改为单例

//单例

private static let aSharedInstance: CLLocationModule = CLLocationModule()

private override init() {}

class func sharedInstance() -> CLLocationModule {

return aSharedInstance

}

外部调用时改为:

CLLocationModule.sharedInstance().GetLatitudeLongitudeAndCity()

成功的代码附上两份

(1)单例

import UIKit

import CoreLocation

class CLLocationModule: NSObject ,CLLocationManagerDelegate{

//单例

private static let aSharedInstance: CLLocationModule = CLLocationModule()

private override init() {}

class func sharedInstance() -> CLLocationModule {

return aSharedInstance

}

var locManager: CLLocationManager!

var latitude:Double?

var longitude:Double?

var city:NSString?

func GetLatitudeLongitudeAndCity(){

if CLLocationManager.locationServicesEnabled() == false {

print("此设备不能定位")

return

}

locManager = CLLocationManager()

locManager.delegate = self

locManager.desiredAccuracy = kCLLocationAccuracyBest

locManager.distanceFilter = 1000.0

//设置定位权限仅ios8有意义

if IS_IOS8 {

locManager.requestWhenInUseAuthorization()// 前台定位

locManager.requestAlwaysAuthorization()

}

locManager.startUpdatingLocation()

}

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

for location in locations {

print("纬度:%g",location.coordinate.latitude);

print("经度:%g",location.coordinate.longitude);

latitude = location.coordinate.latitude

longitude = location.coordinate.longitude

self.saveLatitude(latitude!.description)

self.saveLongitude(longitude!.description)

let geocoder: CLGeocoder = CLGeocoder()

geocoder.reverseGeocodeLocation(location) { (placemarks, error) in

if error != nil {

print("reverse geodcode fail: \(error!.localizedDescription)")

return

}

let pm = placemarks! as [CLPlacemark]

if (pm.count > 0){

for placemark :CLPlacemark in placemarks! {

let placemarkDict = placemark.addressDictionary

let placemarkStr = placemarkDict!["State"]

self.city = placemarkStr?.substringToIndex((placemarkStr?.length)!-1)

self.saveCity(self.city!)

}

}else{

print("No Placemarks!")

}

}

}

manager.stopUpdatingLocation()

}

func locationManager(manager:CLLocationManager, didFailWithError error:NSError) {

print("locationManager error");

}

func saveLatitude(latitude: NSString) {

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

defaults.setObject(latitude, forKey: "latitude")

defaults.synchronize()

}

func readLatitude() -> NSString {

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

let latitude = defaults.objectForKey("latitude") as! NSString

return latitude;

}

func saveLongitude(longitude: NSString) {

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

defaults.setObject(longitude, forKey: "longitude")

defaults.synchronize()

}

func readLongitude() -> NSString {

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

let longitude = defaults.objectForKey("longitude") as! NSString

return longitude;

}

func saveCity(city: NSString) {

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

defaults.setObject(city, forKey: "city")

defaults.synchronize()

}

func readCity() -> NSString {

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

let city = defaults.objectForKey("city") as! NSString

return city;

}

}

外部调用:

CLLocationModule.sharedInstance().GetLatitudeLongitudeAndCity()

(2)强引用

import UIKit

import CoreLocation

class CLLocationModule: NSObject ,CLLocationManagerDelegate{

var locManager: CLLocationManager!

var latitude:Double?

var longitude:Double?

var city:NSString?

func GetLatitudeLongitudeAndCity(){

if CLLocationManager.locationServicesEnabled() == false {

print("此设备不能定位")

return

}

locManager = CLLocationManager()

locManager.delegate = self

locManager.desiredAccuracy = kCLLocationAccuracyBest

locManager.distanceFilter = 1000.0

//设置定位权限仅ios8有意义

if IS_IOS8 {

locManager.requestWhenInUseAuthorization()// 前台定位

locManager.requestAlwaysAuthorization()

}

locManager.startUpdatingLocation()

}

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

for location in locations {

print("纬度:%g",location.coordinate.latitude);

print("经度:%g",location.coordinate.longitude);

latitude = location.coordinate.latitude

longitude = location.coordinate.longitude

self.saveLatitude(latitude!.description)

self.saveLongitude(longitude!.description)

let geocoder: CLGeocoder = CLGeocoder()

geocoder.reverseGeocodeLocation(location) { (placemarks, error) in

if error != nil {

print("reverse geodcode fail: \(error!.localizedDescription)")

return

}

let pm = placemarks! as [CLPlacemark]

if (pm.count > 0){

for placemark :CLPlacemark in placemarks! {

let placemarkDict = placemark.addressDictionary

let placemarkStr = placemarkDict!["State"]

self.city = placemarkStr?.substringToIndex((placemarkStr?.length)!-1)

self.saveCity(self.city!)

}

}else{

print("No Placemarks!")

}

}

}

manager.stopUpdatingLocation()

}

func locationManager(manager:CLLocationManager, didFailWithError error:NSError) {

print("locationManager error");

}

func saveLatitude(latitude: NSString) {

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

defaults.setObject(latitude, forKey: "latitude")

defaults.synchronize()

}

func readLatitude() -> NSString {

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

let latitude = defaults.objectForKey("latitude") as! NSString

return latitude;

}

func saveLongitude(longitude: NSString) {

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

defaults.setObject(longitude, forKey: "longitude")

defaults.synchronize()

}

func readLongitude() -> NSString {

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

let longitude = defaults.objectForKey("longitude") as! NSString

return longitude;

}

func saveCity(city: NSString) {

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

defaults.setObject(city, forKey: "city")

defaults.synchronize()

}

func readCity() -> NSString {

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

let city = defaults.objectForKey("city") as! NSString

return city;

}

}

外部调用:

var aCLLocationModule = CLLocationModule()

self.aCLLocationModule.GetLatitudeLongitudeAndCity()

定位框一闪而过 iOS Swift的更多相关文章

  1. iOS swift的xcworkspace多项目管理(架构思想)

    iOS  swift的xcworkspace多项目管理(架构思想) 技术说明: 今天在这里分享 swift下的 xcworkspace多项目管理(架构思想),能为我们在开发中带来哪些便捷?能为我们对整 ...

  2. iOS Swift 模块练习/swift基础学习

    SWIFT项目练习     SWIFT项目练习2 iOS Swift基础知识代码 推荐:Swift学习使用知识代码软件 0.swift中的宏定义(使用方法代替宏) 一.视图  +控件 1.UIImag ...

  3. ios swift 实现饼状图进度条,swift环形进度条

    ios swift 实现饼状图进度条 // // ProgressControl.swift // L02MyProgressControl // // Created by plter on 7/2 ...

  4. Building gRPC Client iOS Swift Note Taking App

    gRPC is an universal remote procedure call framework developed by Google that has been gaining inter ...

  5. iOS Swift WisdomScanKit图片浏览器功能SDK

    iOS Swift WisdomScanKit图片浏览器功能SDK使用 一:简介      WisdomScanKit 由 Swift4.2版编写,完全兼容OC项目调用. WisdomScanKit的 ...

  6. iOS Swift WisdomScanKit二维码扫码SDK,自定义全屏拍照SDK,系统相册图片浏览,编辑SDK

    iOS Swift WisdomScanKit 是一款强大的集二维码扫码,自定义全屏拍照,系统相册图片编辑多选和系统相册图片浏览功能于一身的 Framework SDK [1]前言:    今天给大家 ...

  7. iOS Swift WisdomHUD 提示界面框架

    iOS Swift WisdomHUD 提示界面框架  Framework Use profile(应用简介) 一:WisdomHUD简介 今天给大家介绍一款iOS的界面显示器:WisdomHUD,W ...

  8. iOS Swift WisdomKeyboardKing 键盘智能管家SDK

    iOS Swift WisdomKeyboardKing 键盘智能管家SDK [1]前言:    今天给大家推荐个好用的开源框架:WisdomKeyboardKing,方面iOS日常开发,优点和功能请 ...

  9. iOS swift项目IM实现,从长连接到数据流解析分析之Socket

    iOS  swift项目IM实现,从长连接到底层数据解析分析之Socket 一:项目简介:  去年开始接手了一个国企移动项目,项目的需求是实现IM即时通讯功能. * 一期版本功能包括了:       ...

随机推荐

  1. webpack+react+antd 单页面应用实例

    React框架已经火了好长一段时间了,再不学就out了! 对React还没有了解的同学可以看看我之前的一篇文章,可以快速简单的认识一下React.React入门最好的实例-TodoList 自己从开始 ...

  2. MPAndroidChart 3.0——LineChart(折线图)

    显示效果 MPAndroidChart每一种图表的基本使用方式都基本相同 了解一种图表的实现 参考项目源码其他的图表也就差不多哩 在布局文件中定义 <com.github.mikephil.ch ...

  3. 蓝牙协议中的SBC编码

    一.从信息的传输说起  上图是一个典型的蓝牙耳机应用场景.手机上的音频信息经过编码以后通过蓝牙协议被蓝牙耳机接收,经过解码以后,蓝牙耳机成功获取手机上的音频信息,然后再转化为振动被人耳识别.这是一个 ...

  4. Android 弱引用和软引用

    软引用 和 弱引用 1.  SoftReference<T>:软引用-->当虚拟机内存不足时,将会回收它指向的对象:需要获取对象时,可以调用get方法. 2.  WeakRefere ...

  5. 第三方开源库和jar包的区别

    jar包和第三方开源库的根本区别在于,开源库的功能比jar包功能更强大,通过引入库项目可以访问java文件以及该开源库项目下的资源文件,例如图片,layout等文件 jar包中只能放class文件 引 ...

  6. 解决adobe air sdk打包 apk后自动在包名前面加上air. (有个点)前缀的问题

    早就找到了这个方法,但是一直忙没心思写博客. 默认情况下,所有 AIR Android 应用程序的包名称都带 air 前缀.若不想使用此默认行为,可将计算机环境变量 AIR_NOANDROIDFLAI ...

  7. SQL Server快速查询某张表的当前行数

    传统做法可能是select count(1) 但是往往会比较慢.推荐如下做法: ) CurrentRowCount FROM sys.sysindexes WHERE id = OBJECT_ID(' ...

  8. freeswitch对接其它SIP设备

    这几天用到freeswitch对接其它设备方面的知识,这里整理下,也方便我以后查阅. 操作系统:debian8.5_x64 freeswitch 版本 : 1.6.8 一.freeswitch作为被叫 ...

  9. JVM原理和优化

    JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境. 1.创建JVM装载环境和配置 2.装载JVM.dll 3.初始化JVM.dll并挂界 ...

  10. 快速排序算法 quick sort的理解

    最近做了一下算法的一些练习,感觉基础薄弱了,只是用一些已经有的东西来完成练习如quickSort(c++使用的时候是sort(起始位置,终止位置,比较函数),这个需要加头文件),但是不知道怎么推出来, ...