2016-06-16 12 views
1

JSONとして送信されたWebサービスからのデータを保持するクラスを作成しようとしています。ここでAlamofireとSwiftyJSONを使用してJSONからデータを保持するクラスを正しく作成する方法

[ 
    { 
    "weekSchedule":[ 
     { 
     "weekDay":"sunday", 
     "listening":[ 
      { 
      "textName":"Programa de teste 1", 
      "textPresenter":"Apresentador", 
      "timeStartHour":"08:00:00", 
      "timeEndHour":"23:59:00", 
      "textDescription":"Descri\u00e7\u00e3o do programa ", 
      "textGuest":"Dr. Lair Ribeiro", 
      "urlImage":"file:\/\/servidor\/lampp\/webservice\/img\/happy.png" 
      }, 
      { 
      "textName":"Teste 2", 
      "textPresenter":"Teste", 
      "timeStartHour":"00:00:00", 
      "timeEndHour":"00:00:00", 
      "textDescription":"", 
      "textGuest":"", 
      "urlImage":"file:\/\/servidor\/lampp\/webservice\/img\/happy.png" 
      } 
     ] 
     }, 
     { 
     "weekDay":"monday", 
     "listening":[ 
      { 
      "textName":"Programa de teste 1", 
      "textPresenter":"Apresentador", 
      "timeStartHour":"08:00:00", 
      "timeEndHour":"23:59:00", 
      "textDescription":"Descri\u00e7\u00e3o do programa ", 
      "textGuest":"Dr. Lair Ribeiro", 
      "urlImage":"file:\/\/servidor\/lampp\/webservice\/img\/happy.png" 
      }, 
      { 
      "textName":"Programa teste marco", 
      "textPresenter":"Marco", 
      "timeStartHour":"08:30:00", 
      "timeEndHour":"09:30:00", 
      "textDescription":"Apenas um programa para testar o json", 
      "textGuest":"Jason", 
      "urlImage":"file:\/\/servidor-ubuntu\/lampp\/webservice\/img\/happy.png" 
      } 
     ] 
     } 
    ] 
    } 
] 

は、私が作成していたモデルクラスです

import Foundation 
import SwiftyJSON 

class Show: ResponseJSONObjectSerializable { 

    var name: String? 
    var description: String? 
    var host: String? 
    var guest: String? 
    var startTime: String? 
    var endTime: String? 
    var urlImage: String? 

    required init(json: JSON) { 
    self.name = json["textName"].string 
    self.description = json["textDescription"].string 
    self.host = json["textPresenter"].string 
    self.guest = json["textGuest"].string 
    self.startTime = json["timeStartHour"].string 
    self.endTime = json["timeEndHour"].string 
    self.urlImage = json["urlImage"].string 
    } 

    required init() {} 
} 

class ShowArray: ResponseJSONObjectSerializable { 

    var weekday: String? 
    var showArray: [Show]? 

    required init?(json: JSON) { 

    self.weekday = json["weekDay"].string 

    if let jsonArray = json["listening"].array { 
     self.showArray = [] 

     for json in jsonArray { 
     let instance = Show(json: json) 
     self.showArray?.append(instance) 
     } 
    } 
    } 

} 

class ScheduleArray: ResponseJSONObjectSerializable { 

    var scheduleArray: [ShowArray]? 

    required init?(json: JSON) { 

    if let weekArray = json["weekSchedule"].array { 
     self.scheduleArray = [] 

     for weekDay in weekArray { 
     let instance = ShowArray(json: weekDay) 
     self.scheduleArray?.append(instance!) 
     } 
    } 
    } 
} 

Alamofire機能はHTTPリクエストを作成する(ここで助けが必要!):ここで私は、サーバーから戻ってきてるJSONです:

func getWeeklyShedule(completionHandler: (Result<ScheduleArray, NSError>) -> Void) { 

    alamofireManager.request(RCAppRouter.GetSchedule()).responseObject { 
     (response: Response<ScheduleArray, NSError>) in 

     guard response.result.isSuccess else { 
     print("Error fetching schedule: \(response.result.error!)") 
     return 
     } 

     completionHandler(response.result) 
    } 
    } 

はその後、私のビューコントローラに私がショー

var listings = [Show]() 
RCAPIManager.sharedInstance.getWeeklyShedule { 
     (result) in 

     guard result.error == nil else { 
     print("Error") 
     return 
     } 

     guard let fetchedSchedule = result.value else { 
     print("No schedule fetched") 
     return 
     } 

     self.listings = fetchedSchedule.scheduleArray ??? 

    } 
の配列にリストを保持する必要があります

これは私が立ち往生した場所です。リストからShowの配列にデータを格納するオブジェクトをループするにはどうしたらいいですか?

達成するために私のコードをリファクタリングするためのヒント予想される結果は、毎日の毎日の分割コントロールです。押されると、それを適切な情報を表示するフィルタとして使用します。

ありがとうございました!

+0

あなたの注意のちょうどFYI。 NSURLSessionを使用してネットワークコードを記述し、データを適切なモデルに解析します。それらの変数を割り当てるモデルの検査と反映に頼るべきではありません。 Alamofireに必要な依存関係をすべて削除します。 – TheCodingArt

+0

ヒント@TheCodingArtのおかげで、私はそれを試してみよう!しかし、私がなぜ私のためにAlamofireに頼ってはならないのか教えていただけますか? – acmobile

+1

実際の利益/利得/理由のないライトラッパーとして依存関係を追加しています。それは本当に反パターンであり、路上の頭痛につながります。 – TheCodingArt

答えて

1

これは最も良い方法ではないかもしれませんが、うまくいくでしょう。

if let responseArray = response as? NSArray { 
    for i in 0..<responseArray.count { 
    let showDic = responseArray[i] as! NSDictionary 
    let dayOfWeek = showDic["weekday"] as! String 
    let showArray = showDic["listening"] as! NSArray 
     switch dayOfWeek { 
     case "sunday": 
      addShowObjectsToArray(showArray, dailyShows: sundayArray) 
     case "monday": 
      addShowObjectsToArray(showArray, dailyShows: mondayArray) 
     case "tuesday": 
      addShowObjectsToArray(showArray, dailyShows: tuesdayArray) 
     case "wednseday": 
      addShowObjectsToArray(showArray, dailyShows: wednsedayArray) 
     case "thursday": 
      addShowObjectsToArray(showArray, dailyShows: thursdayArray) 
     case "friday": 
      addShowObjectsToArray(showArray, dailyShows: fridayArray) 
     case "saturday": 
      addShowObjectsToArray(showArray, dailyShows: saturdayArray) 
     default: 
     } 
    } 

func addShowObjectsToArray(shows: NSArray, dailyShows: NSArray) { 
    for show in shows { 
     let showObject = Show(show) 
     dailyShows.append(showObject) 
    } 
} 
+0

おかげさまで@ brl214あなたの答えを聞いた後、私は自分自身の質問を見つけました。私はsegcontrolのために間違いなく使っていますが、スイッチのイデアが好きです! – acmobile

+0

@acmobile問題ありません!あなたはそれを理解したことをうれしく思いました! – brl214

0

は、私は3つのことを変更することにより、望んだ:

func getWeeklyShedule(completionHandler: (Result<[ScheduleArray], NSError>) -> Void) { 

    alamofireManager.request(RCAppRouter.GetSchedule()).responseArray { 
     (response: Response<[ScheduleArray], NSError>) in 

     guard response.result.isSuccess else { 
     print("Error fetching schedule: \(response.result.error!)") 
     return 
     } 

     completionHandler(response.result) 
    } 
    } 

< ==>は

.responseObject <(< [ScheduleArray]、> NSErrorを結果)(結果)== > .responseArray

(応答:応答)< ==>(応答:応答< [ScheduleArray]、NSErro r>)

関連する問題