2016-12-27 20 views
0

我目前正在使用Swift學習iOS開發。我正在做一個簡單的天氣應用程序。我有幾個按鈕來獲得未來4小時的天氣。我從黑暗的天空API獲取天氣,以JSON格式返回。我終於想出瞭如何從JSON中檢索正確的數據,並創建了一個提取數據的類。從ViewController調用時,如何檢索存儲在單獨類中的數據?

typealias WeatherCallback = (Weather) -> Void 
typealias ErrorCallback = (Error) -> Void 

class NetworkManager { 

    class func getWeather(latitude: String, longitude: String, onSuccess: WeatherCallback? = nil, onError: ErrorCallback? = nil) { 

     let urlString = "https://api.darksky.net/forecast/(api key)/" + latitude + "," + longitude + "?units=si" 

     let url = URL(string: urlString) 

     URLSession.shared.dataTask(with: url!) { (data, response, error) in 
      if error != nil { 
       print(error!) 
       onError?(error!) 
      } else { 
       do { 
        let json = JSON(data: data!) 
        let weather = Weather() 

        DispatchQueue.main.async { 
         weather.updateWithJSON(dict: json["currently"], hour: 0) 

         for i in 1...4 { 
          weather.updateWithJSON(dict: json["hourly"]["data"][i], hour: i) 
         } 
        } 
        onSuccess?(weather) 
       } 
      } 
      }.resume() 
    } 
} 

而且我有一個不同的類來存儲檢索到的數據。

class Weather { 

    public var currentTime: String = "" 
    public var currentTemperature: String = "" 

    public var nextHourTime: String = "" 
    public var nextHourTemperature: String = "" 

    public var nextTwoHourTime: String = "" 
    public var nextTwoHourTemperature: String = "" 

    public var nextThreeHourTime: String = "" 
    public var nextThreeHourTemperature: String = "" 

    public var nextFourHourTime: String = "" 
    public var nextFourHourTemperature: String = "" 

    func updateCurrentData(time: String, temp: String) { 
     currentTime = time 
     currentTemperature = temp 
    } 

    func updateWithJSON(dict: JSON, hour: Int){ 

     switch hour { 
     case 0: 
      currentTime = dict["time"].stringValue 
      currentTemperature = dict["temperature"].stringValue 

     case 1: 
      nextHourTime = dict["time"].stringValue 
      nextHourTemperature = dict["temperature"].stringValue 

     case 2: 
      nextTwoHourTime = dict["time"].stringValue 
      nextTwoHourTemperature = dict["temperature"].stringValue 

     case 3: 
      nextThreeHourTime = dict["time"].stringValue 
      nextThreeHourTemperature = dict["temperature"].stringValue 

     case 4: 
      nextFourHourTime = dict["time"].stringValue 
      nextFourHourTemperature = dict["temperature"].stringValue 

     default: 
      print("rip") 
     } 
    } 
} 

我的問題是,我無法從ViewController內訪問該類Weather存儲的值。

例如

let weather = Weather() 

print(weather.currentTime)

在指着我在正確的方向將是真棒任何幫助!謝謝!

+0

首先,你應該用'weatherWith'或'updateCurrentData'方法初始化'Weather',然後才能通過天氣類的實例獲得存儲值。 – Poles

回答

1

您可以通過創建WeatherSingleton來完成。使用單例只存在該對象的一個​​副本,並且該狀態由任何其他對象共享和訪問。單身的

class Weather { 
public static var sharedInstance = Weather() 
... 
private init() { 
} 
} 

,並得到對象這樣

let weather = Weather.sharedInstance // it will give you the same instance of Weather every time you call it. 
+0

然後我需要在'init'中分配我的變量嗎?當變量被賦值給一個函數時,我該怎麼做? – samuria

+0

沒有。我們使用private聲明init,以防止創建其他天氣對象。 – Sahil

0

你可以在你的ViewController創建要求的GetWeather。此功能可讓您以完成處理程序的方式訪問Weather對象(WeatherCallback =(Weather) - > Void)。

0

在這裏,您可以使用Singleton設計模式。做一個Singleton Weather類,每當你從getWeather函數得到響應時,更新你的Weather單例類。當您想要用戶迴應時,只需從Weather類中獲取值。

1

你可以使用delegate pettern在viewcontroller中獲取結果。首先創建一個這樣的協議:

protocol YourDelegateProtocol { 
    func getDataFromServer(data: String) 
} 

這之後創建此協議的一個實例,在你的網絡管理器類這樣的:

class NetworkManager { 
    var delegate: YourDelegateProtocol?  
} 

得到響應從那裏發送響應您的ViewController後:

URLSession.shared.dataTask(with: url!) { (data, response, error) in 
     if error != nil { 
      print(error!) 
      onError?(error!) 
     } else { 
      do { 
       let json = JSON(data: data!) 
        delegate.geDataFromServer(json as String) 
       } 
       onSuccess?(weather) 
      } 
     } 
     }.resume() 

之後得到您的視圖 - 控制的數據一樣,

class WeatherData: UIViewController, YourDelegateProtocol { 

    var yourModelClass = YourModelClass() //init model class globally. 

    func getDataFromServer(data: String) { 
    // populate json String into your model class. Then you are ready to go. 
    } 
} 
相關問題