2016-01-04 4 views
0

До сих пор мне приходилось иметь дело с простыми массивами JSON только с одним массивом. Я теперь объединен 2 массивов вместе, так что я могу получить мои пользовательские данные и все отзывы для этого пользователя:Доступ к массиву JSON внутри другого массива

[ 
{ 
    "user_id": "16", 
    "name": "Jonh", 
    "lastName": "appleseed", 
    "username": "[email protected]", 
    "sex": "male", 
    "image_url": "", 
    "review": [ 
     { 
      "reviewID": "4", 
      "merchant_id": "17", 
      "rating": "5", 
      "user_id": "16", 
      "comments": "Very good customer. Strongly suggested", 
      "date": "0000-00-00", 
      "reviewYear": "", 
      "publish": "1" 
     }, 
     { 
      "reviewID": "8", 
      "merchant_id": "16", 
      "rating": "2", 
      "user_id": "16", 
      "comments": "Automatic review due to "NO SHOW" without informing the merchant", 
      "date": "0000-00-00", 
      "reviewYear": "", 
      "publish": "1" 
     } 
    ] 
} 
] 

, прежде чем я добавил обзоры моя модель выглядит следующим образом:

import Foundation 

class Users { 
    let userImage:String? 
    let name:String? 
    let sex:String? 
    let image_url:String? 

    init(dictionary:NSDictionary) {    
     userImage = dictionary["userImage"] as? String 
     name = dictionary["name"] as? String 
     sex = dictionary["sex"] as? String 
     image_url = dictionary["image_url"] as? String 
    } 
} 

func loadUser(completion:(([Users])-> Void), userId: String){ 
    let myUrl = NSURL(string: "http://www.myWebSite.com/api/v1.0/users.php") 
    let request = NSMutableURLRequest(URL: myUrl!) 
    request.HTTPMethod = "POST" 
    let postString = "user_id=\(userId)" 
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) 
     { data, response, error in   
      if error != nil {   
       print("error\(error)")  
      } else { 
       do {  
        let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray 
        print(json) 

        var users = [Users]()  
        for user in json{        
         let user = Users(dictionary: user as! NSDictionary)  
         users.append(user)  
         let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
          dispatch_async(dispatch_get_global_queue(priority, 0)){ 
          dispatch_async(dispatch_get_main_queue()){   
            completion(users) 
          } 
         }  
        }   
       } catch{ 
       } 
      } 
     } 
    task.resume() 
} 

, который я мог бы затем используется в моем ViewController:

func loadModel() { 
    let loadingNotification = MBProgressHUD.showHUDAddedTo(self.view, animated: true) 
    loadingNotification.mode = MBProgressHUDMode.Indeterminate 
    loadingNotification.labelText = "updating your deals..." 
    users = [Users]() 
    let api = Api() 
    api.loadUser(didLoadUsers , userId: "16")  
} 

func didLoadUsers(users:[Users]){   
    self.users = users 
    self.tableView.reloadData() 
    MBProgressHUD.hideAllHUDsForView(self.view, animated: true) 
} 

могу ли я получить review поле, так что я могу представить его в контроллере табличного?

+0

Вы должны иметь возможность получить объект «обзор», так же, как вы получали строки, за исключением того, что это будет массив словарей (а не строка). Прокрутите массив «обзор» и сделайте все, что хотите, со словарем. – Putz1103

ответ

0

Выполнено. Это было легче, чем я думал. Я просто должен был добавить UserReview класс и изменить подпись loadUser функции:

func loadUser(completion:((user: [Users], review: [UserReview])-> Void), userId: String){ 

    let myUrl = NSURL(string: "http://www.myWebsite.com/api/v1.0/users.php") 
    let request = NSMutableURLRequest(URL: myUrl!) 
    request.HTTPMethod = "POST" 
    let postString = "user_id=\(userId)" 
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) 
     { data, response, error in 

      if error != nil { 

       print("error\(error)") 

      }else{ 

       do{ 
        let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray 

        var users = [Users]() 


        for user in json{ 

         let user = Users(dictionary: user as! NSDictionary as! [String : AnyObject]) 

         users.append(user) 

     //*********** now I can access the reviews from my son*************** 
        let reviewArray = json[0]["review"] as! NSArray 
         var reviews = [UserReview]() 


         for review in reviewArray{ 

          let review = UserReview(dictionary: review as! NSDictionary as! [String : AnyObject]) 

          reviews.append(review) 

         } 

         let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
         dispatch_async(dispatch_get_global_queue(priority, 0)){ 

          dispatch_async(dispatch_get_main_queue()){ 

           completion(user: users, review: reviews) 
          } 
         } 

        } 

       } catch{ 

       } 
      } 
    } 
    task.resume() 
} 

Так что я могу использовать его в моем tableViewController

 var users: [Users]? 
    var reviews: [UserReview]? 

    func loadModel() { 
    let loadingNotification = MBProgressHUD.showHUDAddedTo(self.view, animated: true) 
    loadingNotification.mode = MBProgressHUDMode.Indeterminate 
    loadingNotification.labelText = "updating..." 
    users = [Users]() 
    reviews = [UserReview]() 
    let api = Api() 
    api.loadUser(didLoadUsers , userId: "16") 
} 

func didLoadUsers(users:[Users], reviews:[UserReview]){ 

     self.users = users 
     self.reviews = reviews 
     self.tableView.reloadData() 
     MBProgressHUD.hideAllHUDsForView(self.view, animated: true)  

    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    if section == 0 { 

     return users!.count 

    } 
    if section == 1 { 

     return 1 

    } 
    if section == 2 { 

    return reviews!.count 
    } 
    return 0 
} 

Так что в моих cellForRowAtIndexPath теперь я могу загрузить все отзывы

if indexPath.section == 2 { 

     let review = reviews![indexPath.row] 


     let reviewCell = tableView.dequeueReusableCellWithIdentifier("reviewCell", forIndexPath: indexPath) as! UserReviewsTableViewCell 
     reviewCell.useReview(review) 

     return reviewCell 
    } 
1

Я добавил в ваш класс Users массив отзывов, которые будут заполнены в вашем пользователе init(). Я рекомендую вам взглянуть на struct Review и сделать ваш пользовательский класс структурой и изменить NSDictionary на swift Dictionary.

struct Review { 
    let reviewID:String? 
    let merchant_id:String? 
    let user_id:String? 
    //to be continued with your own implementation... 

    init(dictionary:[String:String]) { 
     reviewID = dictionary["reviewID"] 
     merchant_id = dictionary["merchant_id"] 
     user_id = dictionary["user_id"] 
     //to be continued with your own implementation... 
    } 
} 
class Users { 

    let userImage:String? 
    let name:String? 
    let sex:String? 
    let image_url:String? 
    var reviews:[Review] 

    init(dictionary:[String:AnyObject]) { 

     userImage = dictionary["userImage"] as? String 
     name = dictionary["name"] as? String 
     sex = dictionary["sex"] as? String 
     image_url = dictionary["image_url"] as? String 
     reviews = [Review]() 
     if let userReviews = dictionary["review"] as? [[String:AnyObject]] { 
      for review in userReviews { 

       if let unwrapedReview = review as? [String:String] { 
        let r = Review(dictionary: unwrapedReview) 
        reviews.append(r) 
       } 
      } 
     } 
    } 
} 

Также я рекомендую вам в будущем использовать SwiftyJSON для разбора JSON, а также Alamofire для сетевых запросов.

+0

Как я могу получить значения в массиве 'отзывы'? – mat

+0

Если я печатаю (user.reviews), я получаю 'myApp.Review (reviewID: необязательный (« 8 »), merchant_id: необязательный (« 16 »), user_id: необязательный (« 16 »))] ()' – mat

+0

' для обзора в user.reviews {print (review)} ' – Andrew

Смежные вопросы