私は迅速なプログラミングで非常に新しいです。私はWebサービスに精通していません。私は詩のためのiOSモバイルアプリケーションを作りたいと思っています。Swift 3 Xcode 8で非同期タスクを最初に完了する方法はありますか?
jsonでエンコードされたデータを取得できましたが、私の問題はここで私のテーブルビューに転送できません。私がそれを実行したとき、問題は非同期タスクのためだと思う。それは非同期タスクであるため、委任されたfuncが実行された後にタスクが実行されるだけであるため、name.countが0のときにtableview(numberOfRows)の委任関数が実行されます。だから私のTableViewで私のデータを見ることができないのです...私は誰かがここで私を助けることを願っています。私はグーグルで、Completion Handlersを試してみました(これは何のために使われているのか分かりません)。そして、私はそれを同期に変えてみました。あなたの完了ブロックで
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
}
}
、あなたが 'NAME'と' bio'アレイを構築完了したら、 'DispatchQueue.main.async {self.tableView.reloadData(呼び出し)} 'を実行してテーブルをリフレッシュします。 – Rob
@RobありがとうRob!私はこれに時間を費やしてきたとは信じられない..また、あなたが言ったことをした、あなたは正しい!正常に動作します。ありがとうございました! – Nadz