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"
}
Die Klassenmethode getYelpComments(for:completionHandler:)
ist für das Abrufen von JSON-Daten von der Yelp-API zuständig. Zu meiner Überraschung, obwohl das comments
Instanz-Array durch Hinzufügen neuer YelpComment
Objekte aktualisiert wird, hat sein count
unterschiedliche Werte innerhalb und außerhalb des Verschlusses.Warum hat eine Instanzvariable innerhalb eines Abschlusses einen anderen Wert?
Diese Kommentare sollen in einer Tabellenansicht angezeigt werden. Was mich weiter verwirrt ist die Tatsache, dass, wenn ich tableView.reloadData()
innerhalb der Schließung hinzufügen, bekomme ich eine index out of bounds for an empty array
Fehler, aber wenn ich die gleiche Codezeile hinzufügen: tableView.reloadData()
außerhalb der Schließung bekomme ich keinen Fehler und comments.count
gleich Null. Jede Hilfe würde sehr geschätzt werden!
P.S. Ich weiß nicht, ob das Erwähnen etwas bewirken wird, aber data
ist @escaping
. Ich verwende auch SwiftyJSON
und Alamofire
.
UPDATE:
Meine Tabellenansicht Datenquelle Methoden sind:
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' ist ein Async-Aufruf. Print-Anweisung außerhalb von courare wird ausgeführt, bevor der Code in Ihrer Closure ausgeführt wird. Veröffentlichen Sie Ihre 'cellforRow' und' noOfRowsInSection' Methoden, ich denke, diese Methoden verursachen den Absturz. – Bilal
@Bilal aktualisiert meine Frage mit Tabellenansicht Datenquellmethoden. –