全局变量重置的定义

时间:2015-08-13 17:50:37

标签: swift

我有一个类,用于从API获取特定日期的温度数据并将其添加到字典中。 API的URL存储在名为 baseURL 的全局变量中。它在开头定义为空字符串,但稍后会更改。我的课程如下:

import UIKit
import Foundation
typealias ServiceResponse = (JSON, NSError?) -> Void

class WeatherManager: NSObject {

var baseURL: String = ""
var data: String = ""
static let sharedInstance = WeatherManager()


func getRandomUser(onCompletion: (JSON) -> Void) {
    println("Starting getRandomUser")
    let route = self.baseURL
    println(self.baseURL)
    makeHTTPGetRequest(route, onCompletion: { json, err in
        onCompletion(json as JSON)
    })
}

func makeHTTPGetRequest(path: String, onCompletion: ServiceResponse) {
    let request = NSMutableURLRequest(URL: NSURL(string: path)!)

    let session = NSURLSession.sharedSession()

    let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
        let json:JSON = JSON(data: data)
        onCompletion(json, error)
        if error != nil {
            println("No Error")
        } else {
            println("Error")
        }
    })
    task.resume()
}

func addData() {
    WeatherManager.sharedInstance.getRandomUser { json in
        var jsonData = json["response"]["version"]
        self.data = "\(jsonData)"
        dispatch_async(dispatch_get_main_queue(),{
            let alert = UIAlertView()
            alert.title = "Weather Data Update"
            if self.data != "null" {
                println("Value:\(self.data)")
                alert.message = "The weather data was updated successfully."
                alert.addButtonWithTitle("OK")
                alert.show()
            } else {
                println("Error Reading Data")
                println(self.data)
                alert.message = "HealthTrendFinder encountered an error while updating data."
                alert.addButtonWithTitle("OK")
                alert.show()
            }
        })
    }
}

func updateWeatherHistory() {
    println(self.baseURL)
    let calendar: NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    println("Weather Updating...")
    // This sets the start date to midnight of the current date if no start date has been set.
    if StorageManager.getValue(StorageManager.StorageKeys.WeatherStartDate) == nil {
        let startDate: NSDate = calendar.startOfDayForDate(NSDate())
        StorageManager.setValue(startDate, forKey: StorageManager.StorageKeys.WeatherStartDate)

    }

    // This adds a data array if it hasn't been created yet.
    if StorageManager.getValue(StorageManager.StorageKeys.WeatherData) == nil {
        StorageManager.setValue([:], forKey: StorageManager.StorageKeys.WeatherData)

    }

    var weatherData: [NSDate: NSObject] = StorageManager.getValue(StorageManager.StorageKeys.WeatherData)! as! [NSDate : NSObject]
    let startMidnight: NSDate = StorageManager.getValue(StorageManager.StorageKeys.WeatherStartDate) as! NSDate
    let currentMidnight: NSDate = calendar.startOfDayForDate(NSDate())
    let daysFromStartDate: Int = calendar.components(NSCalendarUnit.CalendarUnitDay, fromDate: startMidnight, toDate: currentMidnight, options: nil).day
    println("Starting Loop")
    for i: Int in 0..<daysFromStartDate {

        let dateToBeExamined: NSDate = calendar.dateByAddingUnit(NSCalendarUnit.CalendarUnitDay, value: i, toDate: startMidnight, options: nil)!
        if weatherData[dateToBeExamined] == nil {
            let calendarUnits: NSCalendarUnit = .CalendarUnitDay | .CalendarUnitMonth | .CalendarUnitYear
            let components = NSCalendar.currentCalendar().components(calendarUnits, fromDate: dateToBeExamined)
            var month: String
            var day: String
            if components.month < 10 {
                month = "0\(components.month)"
            } else {
                month = "\(components.month)"
            }
            if components.day < 10 {
                day = "0\(components.day)"
            } else {
                day = "\(components.day)"
            }
            var dateString = "\(components.year)\(month)\(day)"
            self.baseURL = "http://api.wunderground.com/api/91e65f0fbb35f122/history_\(dateString)/q/OR/Portland.json"
            println(self.baseURL)
            var get: () = WeatherManager.sharedInstance.addData()
            println(get)
            weatherData[dateToBeExamined] = self.data




            // There is no data for the NSDate dateForInspection. You need to pull data and add it to the dictionary.
        } else {
            // Data exists for the specified date, so you don't need to do anything.
        }
    }
    println("Loop has finished or been skipped")

}

}

问题是,在baseURL设置为URL之后,当执行 getRandomUser 时,baseURL会恢复为空字符串。为什么会发生这种情况,我该如何解决?

1 个答案:

答案 0 :(得分:1)

您的代码不必要地复杂,如果没有更多信息,很难诊断出问题。但这是一个建议:

尝试无法实例化WeatherManager单例的多个实例:

class WeatherManager {

    private static let _sharedInstance = WeatherManager()

    private init() { super.init() }

    static func sharedInstance() -> WeatherManager {
        return _sharedInstance
    }
}

当您在外部WeatherManager工作时,可以通过以下方式访问它:

let wm = WeatherManager.sharedInstane()

然后,当您在WeatherManager内工作时,请确保所有引用都是self - 即self.baseURL = ...self.updateWeatherHistory(),而不是WeatherManager.sharedInstance.baseURL = ...等等。

虽然你的代码很复杂,但我认为发生的事情是你实际上有两个WeatherManager实例。您将baseURL的值设置为一个,而不是另一个。如果你想让它成为一个单身人士,你需要创造不止一个。

相关问题