func loadYelpComments(){
guard let business = business else {return}
guard let _ = tableView else {return}
guard let businessID = business.id else {return}
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .full
HTTPHelper.getYelpComments(for: businessID, completionHandler: { data in
let json = JSON(data)
let reviews = json["reviews"].arrayValue.map({return $0.dictionaryValue})
var commentDate: Date?
for (index, review) in reviews.enumerated(){
let userDictionary = review["user"]?.dictionary
if let dateString = review["time_created"]?.stringValue{
commentDate = dateFormatter.date(from: dateString)
}
let yelpComment = YelpComment(rating: review["rating"]?.intValue, userImageURL: userDictionary?["image_url"]?.stringValue, userName: userDictionary?["name"]?.stringValue, comment: review["text"]?.stringValue, commentDate: commentDate, commentPageURL: review["url"]?.stringValue)
self.comments.append(yelpComment)
}
print("Number of comments: \(self.comments.count)") //Prints: Number of comments: 3"
self.tableView.reloadData()
})
print("Number of comments: \(self.comments.count)") //This prints firt "Number of comments: 0"
}
La méthode de classe getYelpComments(for:completionHandler:)
est chargée d'extraire les données JSON de l'API Yelp. À ma grande surprise, même si le tableau d'instance comments
est mis à jour en y ajoutant de nouveaux objets YelpComment
, son count
a des valeurs différentes à l'intérieur et à l'extérieur de la fermeture.Pourquoi une variable d'instance a-t-elle une valeur différente à l'intérieur d'une fermeture?
Ces commentaires sont supposés être affichés dans une vue de tableau. Ce qui m'embarrasse encore, c'est que quand j'ajoute tableView.reloadData()
dans la fermeture, j'obtiens une erreur index out of bounds for an empty array
mais quand j'ajoute la même ligne de code: tableView.reloadData()
de l'autre côté de la fermeture, je n'obtiens aucune erreur et comments.count
équivaut à zéro. Toute aide serait très appréciée!
P.S. Je ne sais pas si mentionner cela va faire une différence, mais data
est @escaping
. J'utilise également SwiftyJSON
et Alamofire
.
MISE À JOUR:
Mon point de vue de la table des méthodes de source de données sont les suivantes:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == 0 {
return super.tableView(tableView, numberOfRowsInSection: section)
} else {
return comments.count
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.section == 0 {
return super.tableView(tableView, cellForRowAt: indexPath)
} else {
let cell = tableView.dequeueReusableCell(withIdentifier: CustomCellTypeIdentifiers.YelpCommentCell, for: indexPath) as! YelpCommentCell
cell.configureYelpCell(with: comments[indexPath.row])
return cell
}
}
'getYelpComments' est un appel asynchrone. L'instruction d'impression en dehors de cloure s'exécute avant que le code de votre fermeture s'exécute. Publiez vos méthodes 'cellforRow' et' noOfRowsInSection', je pense que ces méthodes causent l'accident .. – Bilal
@Bilal mis à jour ma question avec les méthodes de source de données vue table. –