質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

3554閲覧

【swift2】JSONデータで取得したデータの表示速度が遅い

m_tsukasa

総合スコア7

Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/06/27 02:40

編集2016/06/28 01:25

###前提・実現したいこと
データベースのデータをJSONで吐き出すPHPにアクセスし
受け取ったデータをTableViewタイムラグを防いでシームレスに表示させたい。

###発生している問題・エラーメッセージ

現在、掲示板アプリを作成していますが。
サーバーにあるデータベースからJSONデータで吐き出すPHPがあります。
そのPHPへアクセスし取得したJSONデータをTableViewでデータを表示しようとしてるのですが、
その表示速度があまりにも遅いので速度アップを図りたいです。
データの内容はテキストと画像です。

###該当のソースコード
TableViewController.swift

Swift

1import UIKit 2 3class TableViewController: UITableViewController { 4 5 var bbsData:[BbsData] = [BbsData]() 6 var offset = 0 7 var userId: String? 8 @IBOutlet var filterBtn: UIBarButtonItem! 9 10 func getData(){ 11 let url = NSURL(string:"データを取得するPHPへのURL") 12 let config = NSURLSessionConfiguration.defaultSessionConfiguration() 13 let session = NSURLSession(configuration: config) 14 let req = NSMutableURLRequest(URL: url!) 15 req.HTTPMethod = "POST" 16 req.HTTPBody = ("データの絞込み用POSTパラメータ").dataUsingEncoding(NSUTF8StringEncoding) 17 let task = session.dataTaskWithRequest(req, completionHandler: { 18 (data,resp,err) in 19 do{ 20 let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary 21 if json.count > 0{ 22 if let bbsDatas = json["bbsData"] as? NSArray{ 23 self.offset += bbsDatas.count 24 for data1 in bbsDatas{ 25 let basebaseUrl: String = "DBからの画像を表示するPHPへのURL" 26 let commentId = data1["commentId"] as! String 27 let baseUrl = basebaseUrl + commentId 28 let url = baseUrl as NSString 29 let nameStr = data1["userName"] as? NSString 30 let ageStr = data1["age"] as? NSString 31 let prefStr = data1["pref"] as? NSString 32 let commentStr = data1["comment"] as? NSString 33 let userId = data1["userListId"] as? NSString 34 let gender = data1["gender"] as? NSString 35 self.setupBbsDatas(url, nameStr: nameStr, ageStr: ageStr, prefStr: prefStr, commentStr: commentStr, userId: userId, gender: gender) 36 } 37 } 38 self.tableView.reloadData() 39 } 40 }catch{ 41 print("error") 42 } 43 }) 44 task.resume() 45 46 } 47 override func viewDidLoad() { 48 super.viewDidLoad() 49 let backBtn = UIBarButtonItem() 50 backBtn.title = "戻る" 51 self.navigationItem.backBarButtonItem = backBtn 52 getData() 53 } 54 55 56 @IBAction func filterClick(sender: UIBarButtonItem){ 57 let storyboard = UIStoryboard(name:"Main",bundle:nil) 58 let nextView:UIViewController = storyboard.instantiateViewControllerWithIdentifier("filterSelect") 59 nextView.modalTransitionStyle = UIModalTransitionStyle.PartialCurl 60 navigationController?.pushViewController(nextView, animated: true) 61 } 62 63 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 64 userId = bbsData[indexPath.row].userId as String 65 tableView.deselectRowAtIndexPath(indexPath, animated: true) 66 let storyboard = UIStoryboard(name:"DetailProf",bundle:nil) 67 let nextView:UIViewController = storyboard.instantiateViewControllerWithIdentifier("detailProfile") 68 nextView.modalTransitionStyle = UIModalTransitionStyle.PartialCurl 69 let viewController = nextView as! DetailProf 70 viewController.userListId = userId 71 navigationController?.pushViewController(nextView, animated: true) 72 73 74 } 75 override func didReceiveMemoryWarning() { 76 super.didReceiveMemoryWarning() 77 } 78 79 override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 80 return 1 81 } 82 83 override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 84 85 return bbsData.count 86 } 87 88 89 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 90 print(indexPath.row) 91 let cell: bbsTableCell = tableView.dequeueReusableCellWithIdentifier("bbsDataCell", forIndexPath: indexPath) as! bbsTableCell 92 cell.setCell(bbsData[indexPath.row]) 93 if (self.bbsData.count - 1) == indexPath.row { 94 getData() 95 } 96 //self.tableView.reloadData() 97 return cell 98 } 99 100func setupBbsDatas(bbsImage: NSString, nameStr: NSString?, ageStr: NSString?, prefStr: NSString?, commentStr: NSString?, userId: NSString?, gender: NSString?){ 101 let data = BbsData(bbsImage: bbsImage, nameStr: nameStr, ageStr: ageStr, prefStr: prefStr, commentStr: commentStr, userId: userId, gender: gender) 102 bbsData.append(data) 103 } 104 105 106}

Model.swift

Swift

1import Foundation 2 3class BbsData: NSObject{ 4 var bbsImage: NSString 5 var nameStr: NSString 6 var ageStr: NSString 7 var prefStr: NSString 8 var commentStr: NSString 9 var userId: NSString 10 var gender: NSString 11 12 init(bbsImage: NSString, nameStr: NSString?, ageStr: NSString?, prefStr: NSString?, commentStr: NSString?, userId: NSString?, gender: NSString?){ 13 self.bbsImage = bbsImage 14 15 if nameStr != nil{ 16 self.nameStr = nameStr! 17 }else{ 18 self.nameStr = "" 19 } 20 if ageStr != nil{ 21 self.ageStr = ageStr! 22 }else{ 23 self.ageStr = "" 24 } 25 if prefStr != nil{ 26 self.prefStr = prefStr! 27 }else{ 28 self.prefStr = "" 29 } 30 if commentStr != nil{ 31 self.commentStr = commentStr! 32 }else{ 33 self.commentStr = "" 34 } 35 if userId != nil{ 36 self.userId = userId! 37 }else{ 38 self.userId = "" 39 } 40 if gender != nil { 41 self.gender = gender! 42 }else{ 43 self.gender = "非表示" 44 } 45 } 46 47}

bbsTableCell.swift

swift

1import UIKit 2 3class bbsTableCell: UITableViewCell { 4 5 @IBOutlet var postImage: UIImageView! 6 @IBOutlet var nameLabel: UILabel! 7 @IBOutlet var ageLabel: UILabel! 8 @IBOutlet var prefLabel: UILabel! 9 @IBOutlet var commentLabel: UILabel! 10 @IBOutlet var genderImage: UIImageView! 11 12 override func awakeFromNib() { 13 super.awakeFromNib() 14 // Initialization code 15 } 16 17 override func setSelected(selected: Bool, animated: Bool) { 18 super.setSelected(selected, animated: animated) 19 20 // Configure the view for the selected state 21 } 22 23 func setCell(bbsData: BbsData){ 24 25 nameLabel.text = bbsData.nameStr as String 26 ageLabel.text = bbsData.ageStr as String + "才" 27 prefLabel.text = bbsData.prefStr as String 28 commentLabel.text = bbsData.commentStr as String 29 switch bbsData.gender { 30 case "男性": 31 genderImage.image = UIImage(named: "genderMale") 32 33 case "女性": 34 genderImage.image = UIImage(named: "genderFemale") 35 36 default: 37 genderImage.image = UIImage(named: "genderNodisplay") 38 39 } 40 let url = NSURL(string: bbsData.bbsImage as String) 41 let requestUrl = NSURLRequest(URL: url!) 42 NSURLConnection.sendAsynchronousRequest(requestUrl, queue: NSOperationQueue.mainQueue()){(response,data,error) -> Void in 43 if error != nil{ 44 //print(error) 45 }else{ 46 if let dlImage = UIImage(data: data!){ 47 self.postImage.image = dlImage 48 } 49 } 50 } 51 52 } 53 54}

###調査したこと、試したこと
TableViewController.swiftのソースに以下のコードを追加してみましたが、
改善されませんでした。

Swift

1override func viewWillAppear(animated: Bool){ 2 self.tableView.reloadData() 3 super.viewWillAppear(animated) 4}

データの読み込み時(表示がされていない時)に、フリック、タップを行うと描画がされるので、
描画周りでの問題だとは思っています。

###補足情報(言語)
Xcode7.3
Swift2.*

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m_tsukasa

2016/06/27 05:22

説明ベタで申し訳ございません。 どのように回答したらいいのかご教授願います。
guest

回答1

0

ベストアンサー

Instrumentsで計測はしてみましたか?
もしまだしていないならTime profilerあたりでどこに時間がかかっているのかを調べることから始めてはどうでしょうか。

使い方がわからない場合は参考サイトをみてください。

参考

InstrumentsのTime Profilerを使って重たいメソッドを特定する

追記

ソース見てひとつ気がつきました
getData()内の完了ハンドラ内でtableView.reloadData()を呼んでいますが、ここはたぶんバックグラウンドスレッドで実行されています。
バックグラウンドスレッドからUIKitを触ったために表示が乱れているのだと思います。

投稿2016/06/28 12:23

編集2016/06/28 12:52
u39ueda

総合スコア950

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m_tsukasa

2016/06/29 01:29 編集

追記の情報ありがとうございます。 tableView.reloadData()の部分を dispatch_async(dispatch_get_main_queue(),{[tableView.reloadData()]}) に変更したところ、希望通りの動作になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問