2016-03-29 2 views
0

Моя задача - загрузить JSON через Alamofire, заполнить мой массив и чуть позже, чтобы показать его внутри func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {, но у меня есть проблема, потому что этот блок начинается до того, как мой массив был заполнен, поэтому я получаю сбой, что мой массив пустой.Зачем заполнять блок Handler не отвечает?

Я думал, что я могу решить эту проблему с completionHandler как:

func abcd(completion: (() -> Void)) { 
    let getMyProfileURL = "\(self.property.host)\(self.property.getMyProfile)" 
    Alamofire.request(.POST, getMyProfileURL, parameters: self.userParameters.profileParameteres, encoding: .JSON).responseJSON { response in 
     do { 
      let json = JSON(data: response.data!) 

      if json["user"].count > 0 { 
       self.profileDetails.append(ProfileDetailsModel(json: json["user"])) 
      } 
     } 
    } 
} 

позже, я называю его:

func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { 
    self.abcd { 
     print("SUCCESS") 
     print(self.profileDetails) 
    } 
} 

но не печатает мой completionHandler код prints. Зачем? В чем проблема и как я могу это исправить?

P.S Если вы можете предложить мне лучшее решение для моей задачи, было бы здорово!

+0

инициализирует массив, когда вы получите ответ, а затем перезагрузить CollectionView. – sourav

+0

вам нужно перезагрузить представление коллекции, как только вы закончите с асинхронным запросом данных –

+1

, вы не вызывали блок завершения в функции 'abcd', поэтому он ничего не печатает. – TangZijian

ответ

1

Загрузите CollectionView в основной поток, как только закончите с асинхронным запросом данных.

func abcd(completion: (() -> Void)) { 
    let getMyProfileURL = "\(self.property.host)\(self.property.getMyProfile)" 
    Alamofire.request(.POST, getMyProfileURL, parameters: self.userParameters.profileParameteres, encoding: .JSON).responseJSON { response in 
     do { 
      let json = JSON(data: response.data!) 

      if json["user"].count > 0 { 
       self.profileDetails.append(ProfileDetailsModel(json: json["user"])) 
       dispatch_async(dispatch_get_main_queue()) { 
        collectionView.reloadData() 
       } 
      } 
     } 
    } 
} 
+1

О, я полностью забыл об этом методе UICollectionView! Благодаря! –

1

Ответ на «почему он не печатает completionHandler код»: потому что вы никогда не вызывает обработчик завершения в abcd. Правильный код будет выглядеть так:

func abcd(completion: (() -> Void)) { 
let getMyProfileURL = "\(self.property.host)\(self.property.getMyProfile)" 
Alamofire.request(.POST, getMyProfileURL, parameters: self.userParameters.profileParameteres, encoding: .JSON).responseJSON { response in 
    do { 
     let json = JSON(data: response.data!) 

     if json["user"].count > 0 { 
      self.profileDetails.append(ProfileDetailsModel(json: json["user"])) 
     } 
     completion() 
    } 
} 

}

+1

и @Kumar KL дает правильный ответ о просмотре коллекции после загрузки данных. – TangZijian

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