2016-06-02 5 views
1

빠른 여기. NetworkService라는 클래스가 있습니다. NSURLSession 및 완료 블록을 설정하는 방법이 있습니다. My Object 클래스 인 NewsItem에는 첫 번째 메서드를 호출하고 URL로 이동하여 JSON 데이터를 다운로드하고 배열에 추가 한 다음 반환하는 메서드 downloadNewsItems이 있습니다. 그 시점까지 모든 것이 내가 원하는대로 작동합니다. 개체를 만들고 추가 한 다음 반환합니다 (메서드 이름은 downloadImage이지만 모든 종류의 데이터에서 작동 할 수 있습니다).JSON 데이터 다운로드 그런 다음 다시로드 콜렉션보기

func downloadImage(completion: (NSData -> Void)) { 
    let request = NSURLRequest(URL: self.url) 
    let dataTask = session.dataTaskWithRequest(request) { (data, response, error) in 

     if error == nil { 
      if let httpResponse = response as? NSHTTPURLResponse { 
       switch (httpResponse.statusCode) { 
       case 200: 
        if let data = data { 
         completion(data) 
        } 
       default: 
        print(httpResponse.statusCode) 
       } 
      } 
     } else { 
      print("Error: \(error?.localizedDescription)") 
     } 
    } 

    dataTask.resume() 
} 

여기 내 객체 클래스에서 동일한 메소드가 구현되었습니다.

print(newsItems.count)은 내 개체를 사전에 적절하게 다운로드하여 업데이트했습니다. 이제 여기에 문제가 온다. 나는 CollectionViewController입니다. 메서드 호출에서 얻은 데이터로 채 웁니다. 나는 배열을 만들고 내부 객체를 반환하는 메서드를 호출합니다. ViewDidLoad: 그러나 NO! 인쇄 할 때 0이되고 collectionView에 셀이 표시되지 않습니다. 있는 viewDidLoad에서 다음

var newsItems = [NewsItem]() 

: 객체가 다운로드

newsItems = NewsItem.downloadNewsItems() 
print(newsItems.count) 
collectionView.reloadData() 

, 내 초기화() 메소드에 의해 설정 얻고 NetworkService와/NewsItem의 클래스의 내부하지만, 동안 방법의 배열에 추가 컬렉션 뷰 컨트롤러에서 메서드를 호출 할 때, 아무 것도. 처음에는 기본 JSONSerialisation 라우트를 시도했지만 동일한 문제점이있었습니다. 어쩌면 내가 제대로하지 않을 거라 생각 했어. 제 3 자 JSON 라이브러리 (SwiftyJSON)로 전환 ... 정확히 동일한 문제. 도와주세요. 나는이 3 주를 보냈다. 나는 .. 할 수 없다. 더 이상은 ..

답변

2

user2361090,

당신은 downloadNewsItems 안에 모든있는 NewsItem를 가져올 수있는 웹 서비스 호출을하고 있습니다. 비동기 호출입니다. 따라서 프로세스를 가져 와서 newsItems 배열을 채우는 데는 약간의 시간이 걸립니다. 하지만 채워지기 전에 채워지기를 기다리지 않고 있습니다. 따라서 반환 된 빈 배열은 newsItems = NewsItem.downloadNewsItems()입니다. 블록을 사용하여 데이터를 핸드 오버합니다. 마지막으로 당신이로 호출 할 수 있습니다

static func downloadNewsItems(completionBlock block : ([NewsItem]) ->()){ 

    var newsItems = [NewsItem]() 

    let url = NSURL(string: "http://my-url.com.json") 
    let networkService = NetworkService(url: url!) 

    networkService.downloadImage { (data) -> Void in 

     let jsonData = JSON(data:data) 

     for item in jsonData["stories"].arrayValue { 

      // print(item["title"]) 

      let newsArticle = NewsItem() 
      newsArticle.category = item["category"].string 
      newsArticle.titleText = item["title"].string 
      newsArticle.paragraph1 = item["paragraph1"].string 
      newsArticle.paragraph2 = item["paragraph2"].string 
      newsArticle.featureImage = NSURL(string: "\(item["headerImage"].string)") 
      newsArticle.date = item["date"].string 
      newsArticle.majorReference = item["majorReference"].string 
      newsArticle.fact = item["fact"].string 

      newsItems.append(newsArticle) 

     } 

     print(newsItems.count) 
     //if the control comes here in background thread because you know you have to reload the collection view which is UI operation change it main thread 
     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
      block(newsItems) 
     }) 
    } 

} 

NewsItem.downloadNewsItems{ (passedArray) ->() in 
     newsItems = passedArray 
     collectionView.reloadData() 
} 
+0

선생님 귀하의 방법을 변경, 코드 충돌 결코 수 있으며 커피는 부족하지 않을 수도 있습니다. 당신은 진정한 영웅입니다. 고맙습니다. 완벽하게 일했습니다! – Mwiti

+0

@ user2361090 : hehehehehehe :) 당신은 항상 환영합니다 :) Happy coding :) –