3

PHP と MySQL をデータベースとして使用しています。データベースからテーブルビューにデータを表示します。以前は機能していましたが、エミュレーターで数回実行した後、同じエラーが発生しました

class Home: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var btnaddclass: UIButton!
@IBOutlet var tableView: UITableView!
   var values: NSArray = []

func get(){
    let url = NSURL(string: "http://localhost/show_db.php")
    let data = NSData(contentsOf: url! as URL)
    values = try! JSONSerialization.jsonObject(with: data! as Data, options:JSONSerialization.ReadingOptions.mutableContainers)as! NSArray
    tableView.reloadData()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return values.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! SpecialCell
    let maindata = values[indexPath.row] as! [String:AnyObject]

    cell.Lblclasstitle.text = maindata["class_title"] as? String
    cell.Lblschool.text = maindata["school"] as? String
    cell.Lblsubject.text = maindata["subject"] as? String
    return cell
}
   override func viewDidLoad() {
    self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    get()


}
override func viewWillAppear(_ animated: Bool) {
    self.tableView.reloadData()
}
}
4

3 に答える 3

5

1. Swift3 でクラスを使用NS...しないでください。例えば:

let url = URL(string: "http://localhost/show_db.php")
let data = Data(contentsOf: url!)

2.例外には do-try-catch を使用します。

do {
    try ...
} catch {
    // handle exception
}

as!3.それがどのクラスであるか確信がない限り、使用しないでください。これを使って:

if let array = some as? Array {
    // use array now
}
于 2017-01-15T13:08:53.547 に答える
1

あなたのコードは問題だらけです。

「やってみる!」呼び出しているコードが例外をスローすると、式がクラッシュします。それがあなたがクラッシュしている理由です。特に外部ソースからのデータの処理では、そうしないでください。do { try.. } catch { }代わりに使用してください。Apple のドキュメントやオンラインには、迅速な try/catch ブロックの例がたくさんあります。

表示されるエラー メッセージは、何が問題なのかを示しています。JSON データ ストリームの最後に文字化けが発生しています。データ ストリームを文字列に変換してログに記録します。

as!オブジェクトを目的の型にキャストできることが確実でない限り、どちらも使用しないでください。(強制キャストは失敗するとクラッシュします。)

@OOPer がコメントで述べているように、メイン スレッドの URL からデータをロードするべきではありません。これにより、読み込みが完了するまで UI がロックされ、読み込みに時間がかかりすぎるとアプリが強制終了される可能性があります。のような非同期メソッドを使用する必要がありますURLSession

于 2017-01-15T13:24:24.747 に答える