Ios NSTimer()能否不间断运行?(Xcode v 7.0.1,Swift 2.0)

Ios NSTimer()能否不间断运行?(Xcode v 7.0.1,Swift 2.0),ios,xcode,swift,nstimer,google-maps-sdk-ios,Ios,Xcode,Swift,Nstimer,Google Maps Sdk Ios,我正在构建一个iOS应用程序,使用谷歌地图SDK在地图上显示我学校的校园班车位置。我通过解析每10秒刷新一次的XML文件来获取航天飞机的位置 我正在使用NSTimer()每10秒运行一次viewDidLoad(),以便在地图上更新总线的位置 我遇到的问题是,在运行了6到7次viewDidLoad()之后,代码崩溃了。这是不好的,因为我需要我的代码不断刷新以更新总线的位置 我是否正确使用了NSTimer()?NSTime()能否持续运行,或者NSTime()的运行时间是否有限制? 以下是我的代码:

我正在构建一个iOS应用程序,使用谷歌地图SDK在地图上显示我学校的校园班车位置。我通过解析每10秒刷新一次的XML文件来获取航天飞机的位置

我正在使用NSTimer()每10秒运行一次viewDidLoad(),以便在地图上更新总线的位置

我遇到的问题是,在运行了6到7次viewDidLoad()之后,代码崩溃了。这是不好的,因为我需要我的代码不断刷新以更新总线的位置

我是否正确使用了NSTimer()?NSTime()能否持续运行,或者NSTime()的运行时间是否有限制?

以下是我的代码:

import UIKit
import GoogleMaps

class ViewController: UIViewController, NSXMLParserDelegate {

    var parser = NSXMLParser()
    var timer  = NSTimer()

    // viewDidLoad()
    override func viewDidLoad() {
        super.viewDidLoad()

        // runs viewDidLoad() every 10 seconds
        timer = NSTimer.scheduledTimerWithTimeInterval(10.0, target: self, selector: "viewDidLoad", userInfo: nil, repeats: true)

        // XML file
        parser = NSXMLParser(contentsOfURL:(NSURL(string:"http://link.to.xml.file.xml"))!)!

        let coord = Coord2()
        parser.delegate = coord
        parser.parse()
        print("coord has a count attribute of \(coord.count)")
        print("coord has \(coord.markers.count) markers")

        // displays the map adjusted to UC Santa Cruz
        let camera = GMSCameraPosition.cameraWithLatitude(37.0000,
        longitude: -122.0600, zoom: 14)
        let mapView = GMSMapView.mapWithFrame(CGRectZero, camera: camera)
        mapView.mapType = kGMSTypeNormal
        mapView.myLocationEnabled = true
        self.view = mapView

        // loops through all the lats and lngs of the buses and produces a marker
        // for them on our Google Maps app
        for marker in coord.markers {
            print("marker id=\(marker.id), lat=\(marker.lati), lng=\(marker.lngi), route=\(marker.route)")

            // displays the buses
            let buses = GMSMarker()
            buses.position = CLLocationCoordinate2DMake(marker.lati, marker.lngi)
            buses.title = marker.route
            if buses.title == "UPPER CAMPUS" {
                buses.icon = UIImage(named: "uppercampus")
            } else if buses.title == "LOOP" {
                buses.icon = UIImage(named: "innerloop")
            }
            buses.snippet = marker.id
            buses.map = mapView
        }
    }

    // didReceiveMemoryWarning()
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

// ParseBase class
// simple base class that is used to consume foundCharacters
// via the parser
class ParserBase : NSObject, NSXMLParserDelegate  {

    var currentElement:String = ""
    var foundCharacters = ""
    weak var parent:ParserBase? = nil

    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
        currentElement = elementName
    }

    func parser(parser: NSXMLParser, foundCharacters string: String) {
        self.foundCharacters = string
    }

}

// Coord2 class
// represents a coord2 tag
// it has a count attribute
// and a collection of markers
class Coord2 : ParserBase {

    var count = 0
    var markers = [Marker]()

    // didStartElement()
    override func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {

        print("processing <\(elementName)> tag from Coord")

        if elementName == "coord2" {

            // if we are processing a coord2 tag, we are at the root
            // of XML file, extract the count value and set it
            print(attributeDict["count"])
            if let c = Int(attributeDict["count"]!) {
                self.count = c
            }
        }

        // if we found a marker tag, delegate further responsibility
        // to parsing to a new instance of Marker
        if elementName == "marker" {
            let marker = Marker()
            self.markers.append(marker)

            // push responsibility
            parser.delegate = marker

            // let marker know who we are
            // so that once marker is done XML processing
            // it can return parsing responsibility back
            marker.parent = self
        }
    }
}

// Marker class
class Marker : ParserBase {

    var id = ""
    var lat = ""
    var lng = ""
    var route = ""
    var lati = 0.0
    var lngi = 0.0

    // didEndElement()
    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {

        print("processing <\(elementName)> tag from Marker")

        // if we finished an item tag, the ParserBase parent
        // would have accumulated the found characters
        // so just assign that to our item variable
        if elementName == "id" {
            self.id = foundCharacters
        }

        // convert the lat to a Double
        else if elementName == "lat" {
            self.lat = foundCharacters
            // cast self.lat as Double
            if let doubleFromlat = Double(self.lat) {
                self.lati = doubleFromlat
            } else { print("foundCharacters for lat does not hold double") }

        }

        // convert the lng to a Double
        else if elementName == "lng" {
            self.lng = foundCharacters
            if let doubleFromlng = Double(self.lng) {
                self.lngi = doubleFromlng
            } else { print("foundCharacters for lng does not hold double") }
        }

        else if elementName == "route" {
            self.route = foundCharacters
        }

        // if we reached the </marker> tag, we do not
        // have anything further to do, so delegate
        // parsing responsibility to parent
        else if elementName == "marker" {
            parser.delegate = self.parent
        }

        // reset found characters
        foundCharacters = ""
    }

}
导入UIKit
导入谷歌地图
类ViewController:UIViewController,NSXMLParserDelegate{
var parser=NSXMLParser()
var timer=NSTimer()
//viewDidLoad()
重写func viewDidLoad(){
super.viewDidLoad()
//每10秒运行一次viewDidLoad()
timer=NSTimer.scheduledTimerWithTimeInterval(10.0,目标:self,选择器:“viewDidLoad”,userInfo:nil,repeats:true)
//XML文件
parser=NSXMLParser(contentsOfURL:(NSURL(字符串):http://link.to.xml.file.xml"))!)!
设coord=Coord2()
parser.delegate=coord
parser.parse()
打印(“coord具有计数属性\(coord.count)”)
打印(“coord有\(coord.markers.count)标记”)
//显示调整为UC Santa Cruz的地图
让摄影机=GMSCameraPosition.cameraWithLatitude(37.0000,
经度:-122.0600,缩放:14)
让mapView=GMSMapView.mapWithFrame(CGRectZero,摄影机:摄影机)
mapView.mapType=kGMSTypeNormal
mapView.myLocationEnabled=true
self.view=mapView
//循环通过总线的所有LAT和LNG并生成标记
//在我们的谷歌地图应用程序上为他们服务
用于坐标中的标记{
打印(“marker id=\(marker.id)、lat=\(marker.lati)、lng=\(marker.lngi)、route=\(marker.route)”)
//显示总线
让总线=GMSMarker()
bus.position=CLLocationCoordinate2DMake(marker.lati,marker.lngi)
bus.title=marker.route
如果Busses.title==“上校区”{
bus.icon=UIImage(名为“uppercampus”)
}如果bus.title==“循环”,则为else{
bus.icon=UIImage(名为:“innerloop”)
}
bus.snippet=marker.id
bus.map=mapView
}
}
//我收到了记忆警告()
重写函数didReceiveMemoryWarning(){
超级。我收到了记忆警告()
//处置所有可以重新创建的资源。
}
}
//解析基类
//用于使用foundCharacters的简单基类
//通过解析器
类ParserBase:NSObject,NSXMLParserDelegate{
var currentElement:String=“”
var foundCharacters=“”
弱变量父级:ParserBase?=nil
func解析器(解析器:NSXMLParser,didStartElement元素名称:String,namespaceURI:String?,qualifiedName qName:String?,attributes attributeDict:[String:String]){
currentElement=elementName
}
func解析器(解析器:NSXMLParser,foundCharacters string:string){
self.foundCharacters=字符串
}
}
//Coord2类
//表示coord2标记
//它有一个count属性
//和一组标记
类Coord2:ParserBase{
变量计数=0
var markers=[Marker]()
//didStartElement()
重写func解析器(解析器:NSXMLParser,didStartElement元素名称:String,namespaceURI:String?,qualifiedName qName:String?,attributes attributeDict:[String:String]){
打印(“来自Coord的处理标签”)
如果elementName==“coord2”{
//如果我们正在处理一个coord2标记,那么我们就在根位置
//对于XML文件,提取计数值并进行设置
打印(属性指令[“计数”])
如果让c=Int(attributeDict[“count”]!){
self.count=c
}
}
//如果我们发现了标记标签,请进一步委派责任
//解析到Marker的新实例的步骤
如果elementName==“标记”{
让marker=marker()
self.markers.append(标记)
//推卸责任
parser.delegate=标记
//让马克知道我们是谁
//所以一旦标记完成XML处理
//它可以返回解析责任
marker.parent=self
}
}
}
//标记类
类标记:ParserBase{
var id=“”
var lat=“”
var lng=“”
var route=“”
var lati=0.0
var lngi=0.0
//双元素()
func解析器(解析器:NSXMLParser,didEndElement元素名称:String,namespaceURI:String?,qualifiedName qName:String?){
打印(“从标记器处理标记”)
//如果我们完成了一个item标记,ParserBase父级
//会累积找到的字符
//所以只需将其分配给我们的item变量
如果elementName==“id”{
self.id=foundCharacters
}
//将lat转换为双精度
else如果elementName==“lat”{
self.lat=foundCharacters
//将self.lat转换为双精度
如果让doubleFromlat=Double(self.lat){
self.lati=doubleFromlat
}else{print(“lat的foundCharacters不包含双精度”)}
}
//将液化天然气转换为双燃料
else如果elementName==“lng”{
self.lng=foundCharacters
如果let doubleFromlng=Double(self.lng){
self.lngi=doubleFromlng
}else{print(“lng的foundCharacters不包含double”)}
}
else如果elementName==“路由”{
self.route=foundCharacters
}
//如果我们到达
timer = NSTimer.scheduledTimerWithTimeInterval(10.0, target: self, selector: "yourNewMethod", userInfo: nil, repeats: true)
func yourNewMethod() {
    //add your code here which you want to run
}