需求:获取经纬度。

方案:我自定义了一个类模块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. centos 域名硬解析(linux)

    centos做硬解析跟Windows一样修改一个文件. 具体文件为:/etc/hosts.修改命令: vi /etc/hosts 格式个Windows也一样的.

  2. 十种MYSQL显错注入原理讲解(一)

    开篇我要说下,在<代码审计:企业级Web代码安全架构>这本书中讲十种MYSQL显错注入,讲的很清楚. 感兴趣请去读完,若处于某种原因没读还想了解,那请继续往下. 1.count,rand, ...

  3. Smart Tag——DevExpress WPF初探

    Smart Tag是一个设计时扩展,所有标准控件均自带这个功能,当然也包括 DevExpress WPF Controls .可以快速设置控件的值或者绑定最重要的属性.它还可以帮助你完成一些重复的工作 ...

  4. Android中使用Notification实现进度通知栏(Notification示例三)

    我们在使用APP的过程中,软件会偶尔提示我们进行版本更新,我们点击确认更新后,会在通知栏显示下载更新进度(已知长度的进度条)以及安装情况(不确定进度条),这就是我们今天要实现的功能.实现效果如下: 在 ...

  5. 华为Java编程军规,每季度代码验收标准

    引言: 这个标准是衡量代码本身的缺陷,也是衡量一个研发人员本身的价值. 军规一:[避免在程序中使用魔鬼数字,必须用有意义的常量来标识.] 军规二:[明确方法的功能,一个方法仅完成一个功能.] 军规三: ...

  6. 关于Apache Spark

    Apache Spark :  https://www.oschina.net/p/spark-project

  7. BigCouch资料整理

    BigCouch架构 CHTTPD 封装了FABIC接口,CouchDB在HTTP层的集群操作 FABRIC  CouchDB集群的操作代理. 主要用于控制CouchDB集群,Erlang层面的操作 ...

  8. 表单中Readonly和Disabled的区别

    1.readonly是要锁定这个控件,通过在界面上无法修改他(但是通过javascript可以修改他). 2.disabled和readonly有相同的地方也是可以锁定这个控件用户不能改变他的值,但是 ...

  9. 开窗函数 First_Value 和 Last_Value

    在Sql server 2012里面,开窗函数丰富了许多,其中带出了2个新的函数 First_Value 和 Last Value .现在来介绍一下这2个函数的应用场景. 首先分析一下First_Va ...

  10. Oracle导入导出

    Oracle 10g 已经引入了数据泵(点击Data Dump)技术,这项技术和之前的exp/imp有哪些好处呢,简单的来说就是恢复和备份速度非常快: 在说明数据泵的使用方法之前,我们先来了解二者的区 ...