2016-09-09 6 views
0

У меня есть tableView в моем приложении, и когда я загружаю приложение, я хочу, чтобы представление было заполнено списком собак (полученным с сервера).Быстрый цикл для цикла, не повторяющийся цикл

У меня есть эта работа, но она будет загружать только первую собаку в списке с сервера.

вот код, начинающийся от того, где он serialises ответ JSON от сервера

do { 
      let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as! [AnyObject] 
      dispatch_async(dispatch_get_main_queue(), { 
       self.tableView.beginUpdates() 
      if let theDogs = json[0] as? [[String: AnyObject]] { 
       for dog in theDogs { 
        print("Dog") 
        if let ID = dog["ID"] as? String { 
         print(ID + " Safe") 
         let thisDog = Dog(name: (dog["Name"] as? String)!, surname: (dog["Surname"] as? String)!, id: (dog["ID"] as? String)!, boarding: true) 
         let newIndexPath = NSIndexPath(forRow: self.dogs.count, inSection: 0) 

          // code here 
         self.dogs.append(thisDog) 
         self.tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Bottom) 


        } 
       } 
      } 
       self.tableView.endUpdates() 
      }) 
     } catch { 
      print("error serializing JSON: \(error)") 
     } 

Вот копия журналов (которая включает в себя печатную ответ от сервера)

Optional([[{"ID":"47","Name":"Sparky","Surname":"McAllister"}], 
[{"ID":"31","Name":"Maddie","Surname":"Crawford"}]]) 
Dog 
47 Safe 

как вы можно увидеть из журнала, в этом списке 2 собаки. Я бы ожидал, что Dog напечатал дважды в журнале, если цикл работал, и 31 Safe, если он попадал на часть кода, которая создает новый объект Dog.

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

благодаря

+1

Структура вашего JSON странная. Это массив из массива только одного словаря. Действительно странно. Поэтому 'theDogs' должен быть [AnyObject], и вы должны зацикливать там с' if let aDog = dog [0] как [String: AnyObject] 'или что-то в этом роде. – Larme

+0

Мой PHP был самоучкой ... Я никогда не разбирался, как избавиться от этого первого массива, я, вероятно, должен опубликовать вопрос об этом lol .... –

+1

Ваш JSON имел бы больше смысла: '[{" ID ":" 47 "," Name ":" Sparky "," Surname ":" McAllister "}, {" ID ":" 31 "," Name " : «Maddie», «Surname»: «Crawford»}] 'Просто массив собак, где собака - это словарь. Тогда вам нужно будет сохранить свой код и изменить только эту строку: 'if let theDogs = json [0] as? [[String: AnyObject]] 'in', если letDogs = json as? [[String: AnyObject]] ' – Larme

ответ

1

Поскольку JSON является массивом массивов, содержащих один словаря каждого при вызове if let theDogs = json[0] вы получите эту часть JSON: [{"ID":"47","Name":"Sparky","Surname":"McAllister"}]
Вам нужно будет позвонить if let theDogs = json[1], чтобы получить эту часть JSON:

[{"ID":"31","Name":"Maddie","Surname":"Crawford"}] 
+0

, так что, если бы я удалил эту строку и просто сделал 'для собаки в json'? –

+0

wait ... я думаю, я вижу это ... я делаю, как я только что упомянул, а затем 'let aDog = dog [0]' как было в комментариях к вопросу? –

1

Хорошо, благодаря ответу Трэвиса я смог увидеть, где я иду не так. Я только немного подправил его предложение, поэтому я отправляю в качестве ответа.

как сказал Тревис, мне тоже нужен доступ json[1], но я мог бы иметь 7 разных собак в этом списке!

так я сделал следующие изменения:

Сейчас: если пусть theDogs = JSON, как? [[AnyObject]] {

, что означает, что в цикле for я обращаюсь к корневому массиву.

Затем я изменил для цикла из:

for dog in theDogs{ 

к: для aDog в theDogs { пусть собака = aDog [0]

что означает для каждого массива в theDogs, я получить единственный объект в массиве и назвать его собакой. проблема решена, и будущее подтверждено.

спасибо всем, кто помог!

+0

Лучшее решение может заключаться в том, чтобы исправить вывод JSON сервером в более простую структуру (массив словарей), которая затем приведет к тому, что ваш код станет более чистым, но предполагается, что у вас есть контроль над сервером, чтобы его изменить. – Travis

+0

Приложение для моих родителей, они нуждались в нем срочно (для бизнеса) ... Я просто заставлю его работать, и исправить все это после того, как они начали его использовать. –

+0

Достаточно справедливо. Единственная проблема с вышеприведенным решением заключается в том, что если сервер когда-либо помещал во внутренний массив более одного слова для словаря, он был бы упущен из-за строки «для aDog в theDogs {let dog = aDog [0]" , Если бы вы хотели, чтобы в будущем было доказательство этого, вам нужно было бы прокручивать любые словари во внутреннем массиве. – Travis

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