2016-09-09 3 views
0

내 앱에 tableView가 있는데, 앱을로드 할 때 뷰가 서버 목록에서 채워지는 목록으로 채워지 길 원합니다.swift for 루프가 충분히 반복되지 않습니다.

나는이 작업을 수행하지만 서버의 목록에있는 첫 번째 개만로드합니다.

은 여기로 서버 여기

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)") 
     } 

에서 JSON 응답을 serialises 곳에서 (서버에서 인쇄 응답 포함) 로그의 사본

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

을의 시작 코드입니다 로그에서 볼 수 있습니다,이 목록에 2 마리의 개가 있습니다. 루프가 작동 중이면 Dog이 로그에 두 번 인쇄되고,는 새 Dog 개체를 만드는 코드 부분에 도달하는 경우 31 Safe으로 인쇄됩니다.

내가 잘못한 것을 해결할 수 없으며 누구든지 내 문제를 볼 수 있습니까?

감사

+1

JSON의 구조가 이상합니다. 단 하나의 사전 배열입니다. 정말 이상해. 그러므로 TheDogs는 [AnyObject] 여야하며, if aDog = dog [0]을 [String : AnyObject]'또는 이와 비슷한 것으로 루프해야합니다. – Larme

+0

내 PHP는 스스로 배웠습니다 ... 나는 첫 번째 배열을 제거하는 법을 배우지 못했을 것입니다. –

+1

당신의 JSON은 "{{"ID ":"47 ","Name ":"Sparky ","Sameame ":"McAllister "}, {"ID ":"31 ","Name " : "Maddie", "Sameame": "Crawford"}]'개가 배열 된 곳으로, 개는 사전입니다. 그런 다음 코드를 유지하고 다음 행을 변경해야합니다.'theDogs = json [0]을 그대로 사용 하시겠습니까? theDogs = json을 let으로하면 [[String : AnyObject]]'를'로'? '[String : AnyObject]]' – Larme

답변

1

당신이 JSON의이 부분을 얻을 if let theDogs = json[0] 호출 할 때 JSON 하나 사전에 각을 포함하는 배열의 배열이기 때문에 : [{"ID":"47","Name":"Sparky","Surname":"McAllister"}]
당신은 JSON의이 부분을 얻을 수 if let theDogs = json[1]를 호출해야합니다 :

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

그래서 내가 그 행을 지우고 그랬다면 어떻게 했나요? '개 안에 개 '? –

+0

기다려라. 나는 그것을 본 것 같아. 나는 방금 언급 한대로 대답했다. 질문의 주석에있는 것처럼 aDog = dog [0]을 보자. –

1

감사합니다. 트래비스의 대답 덕분에 어디서 잘못되었는지 볼 수있었습니다. 나는 그의 제안에 약간의 비틀기를 만들었고 나는 대답으로 올리고있다.

Travis가 말했듯이 나는 json[1]에 액세스 할 필요가 있지만 그 목록에 7 개의 다른 개가있을 수 있습니다!

지금 :하자 theDogs = JSON 경우 로

그래서 나는 다음과 같이 변경했다? [[AnyObject]] {

이는 for 루프에서 루트 배열에 액세스한다는 것을 의미합니다.

난 후 변경된에서 루프 :

for dog in theDogs{ 

행 : theDogs에 aDog위한 { 하자 개 = aDog [0] theDogs 모든 배열 수단

난 거 배열의 유일한 객체를 가져 와서 개라고 부릅니다. 문제가 해결되어 향후에 교정됩니다.

도움을 주신 모든 분들께 감사드립니다!

+0

더 나은 해결책은 서버의 JSON 출력을 더 간단한 구조 (사전 배열)로 수정하면 코드가 더 깨끗해 지도록 유도 할 수 있지만 서버를 변경하기 위해서는 서버를 제어한다고 가정합니다. – Travis

+0

응용 프로그램은 부모님을위한 것입니다. (업무용으로) 긴급히 필요했습니다 ... 사용하기 시작한 후에 모든 것을 고쳐야합니다. –

+0

충분합니다. 위의 솔루션의 유일한 문제는 서버가 어떤 이유로 든 내부 배열에 두 개 이상의 사전을 넣은 경우 "the dogs의 aDog {let dog = aDog [0]" . 만약 당신이 정말로 그것을 증명하고 싶다면 내부 배열에있는 사전들도 반복해야 할 것입니다. – Travis

관련 문제