Je suis très nouveau dans la programmation rapide et je ne suis pas très familier avec les services Web. Je veux créer une application mobile iOS pour les poèmes.Existe-t-il un moyen d'effectuer une tâche asynchrone en premier dans Swift 3 Xcode 8?
J'ai été en mesure de récupérer les données codées json, mais mon problème est que je ne peux pas le transférer dans ma vue de table ici. Quand je l'ai couru, je pense que le problème était dû à la tâche asynchrone. Comme il s'agit d'une tâche asynchrone, les fonctions déléguées de la tableview (numberOfRows) sont exécutées lorsque name.count est toujours 0, car la tâche ne serait exécutée qu'après l'exécution de la fonction déléguée. C'est pourquoi je ne peux pas voir mes données dans mon TableView ... J'espère que quelqu'un peut m'aider ici. J'ai googlé et essayé les gestionnaires d'achèvement (dont je n'ai aucune idée de quoi il est utilisé) et j'ai essayé de le changer en synchrone ce qui m'a conduit à des erreurs .. Merci beaucoup !!!
import UIKit
import Foundation
class TimelineViewController: UIViewController {
@IBOutlet weak var contentTableView: UITableView!
var name = [String]()
var bio = [String]()
@IBOutlet weak var oPostBtn: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
getPoems()
}
func getPoems()
{
let url:NSURL = NSURL(string: "http://192.168.1.6/Test/feed1.php")!
let request:NSMutableURLRequest = NSMutableURLRequest(url:url as URL)
request.httpMethod = "GET"
NSURLConnection.sendAsynchronousRequest(request as URLRequest, queue: OperationQueue.main){(response, data, error) in }
let task = URLSession.shared.dataTask(with: request as URLRequest) {
data, response, error in
if error != nil {
print("Error = \(error)")
return
}
do {
print("Response=\(response)")
let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
print("Response data = \(responseString)")
//Converting response to NSDictionary
var json: NSDictionary!
json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
//getting the JSONArray poems from the response
let returnPoems: NSArray = json["returnPoems"] as! NSArray
print(returnPoems);
//looping through all the json objects in the array teams
for i in 0 ..< returnPoems.count{
let aObject = returnPoems[i] as! [String : AnyObject]
self.name.append(aObject["fullName"] as! String)
self.bio.append(aObject["Bio"] as! String)
//displaying the data
print("Fullname -> ", self.name)
print("Bio ->", self.bio)
print("===================")
print("")
}
}
catch {
print("ERROR: \(error)")
}
}
task.resume()
}
}
extension TimelineViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = contentTableView.dequeueReusableCell(withIdentifier: "PoemCell")
cell?.textLabel?.text = name[indexPath.row]
cell?.detailTextLabel?.text = bio[indexPath.row]
return cell!
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return name.count
}
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
print("You selected cell #\(indexPath.row)!")
let indexPath = tableView.indexPathForSelectedRow!
let currentCell = tableView.cellForRow(at: indexPath)! as UITableViewCell
}
}
Dans votre bloc d'achèvement, lorsque vous avez terminé la construction de la '' name' et tableaux de bio', appelez 'DispatchQueue.main.async {self.tableView.reloadData ()} 'pour avoir une table rafraîchie. – Rob
@Rob Merci beaucoup Rob !! Je n'arrive pas à croire que j'ai passé des heures là-dessus .. Aussi, j'ai fait ce que vous avez dit et vous avez raison! Fonctionne bien. Merci encore! – Nadz