現在、アプリを開発中なのですが壁にぶつかっています。
アプリの特徴としては以下のようなものとなります。
・画面数が多い
・表示している内容は同じようなパターンである
・画面下のタブで画面が切り替えるのだが別のタブでも画面の遷移をつづけると同じ画面に遷移することが多い
問題となっているのは1つの画面でユーザアクションで画面を更新した際に(スタータスの変更など)、見えていない画面もバックグラウンドで更新しないと画面の整合性が取れなくなってしまうということです。
※ナビゲーションコントローラで戻った際も同様です
そこで、NSNotificationCenterをつかって以下のような実装を考えているのですが懸念点やもっと一般的な方法がありましたらおしえていただけないでしょうか?
BaseViewController.swift
class BaseViewController: UIViewController { required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.setUp() } override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) { super.init(nibName: nil, bundle: nil) self.setUp() } convenience init() { self.init(nibName: nil, bundle: nil) } func setUp() { // viewController毎に実装 } deinit { NSNotificationCenter.defaultCenter().removeObserver(self) } }
ViewController1.swift
`
ViewController1: BaseViewController {
var listData1: [Dictionary<String,AnyObject>]? // data1のリスト var listData2: [Dictionary<String,AnyObject>]? // data2のリスト var listData3: [Dictionary<String,AnyObject>]? // data3のリスト override setUp() { NSNotificationCenter.defaultCenter().addObserver(self, selector: "updateData1:", name: "data1", object: nil) NSNotificationCenter.defaultCenter().addObserver(self, selector: "updateData2:", name: "data2", object: nil) NSNotificationCenter.defaultCenter().addObserver(self, selector: "updateData3:", name: "data3", object: nil) } func viewDidLoad() { // 初回はapiなどからデータを取得して // listData1〜3にセット } // data1が更新されたさいに通知される func updateData1(notification: NSNotification) { for var i = 0; i < self.listData1.count; i++ { if notification.userInfo["data1"]["id"] as! String == self.listData1[i]["id"] as! String { self.listData1[i] = notification.userInfo["data1"]["id"] break; } } // VIewの再描画など } // data2、data3についてもdata1と同様の関数を用意
}
`
こんなかんじでviewController毎に必要な箇所で必要なプロパティのNSNotificationCenterを実装している形になっています。
画面数的には100画面を超えていて、data1〜3のようなデータも20パターンくらいあります。
また、listData1〜3なども画面上は隠れている間メモリにもっているかと思うのですが、どこか(ファイルなどのストレージ)に退避させるなどをするのが一般的なのでしょうか?
はじめてのアプリということもあって、やっていてこんなやりかたでいいのか?ってかなり困惑しています。どなたかアドバイスいただけないでしょうか
以下、追記します
画面のイメージとしては以下のようなものとします
・ユーザの一覧画面(各セルにフォローボタンがある)
・ユーザの詳細画面(フォローボタンがある)
ユーザのアクションとして
・一覧画面でフォローボタンをおせる
・一覧画面でセルをタップすると詳細画面へ遷移する
・詳細画面でフォローボタンをおせる
・詳細画面から一覧画面へ戻ることができる
※ここでは2階層としていますがが、実際には詳細画面からまた別の一覧画面へ遷移したりと階層がどんどん深くなっていきます
検討すべき処理のイメージとして
ListViewController.swift
ListViewController : UIViewController { var listData viewDidLoad() { // apiなどからデータを取得してlistDataに保持 } viewWillAppear() { // listDataと①で保存したデータを付き合わせてViewをつくる } }
DetailViewController.swift
DetailViewController : UIViewController { var data viewDidLoad() { // apiなどからデータを取得してdataに保持 } func フォローボタンがおされたら() { // フォローしたユーザIDをファイルやDBなどに保持・・・① } }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/05 00:58
2015/08/06 03:34