2017-06-12 15 views
0

私はネットワークと呼ばれる1つのクラスだけのユーザーのリストを変更したいと思います。そして、私はuserListが変更された後、TableViewの更新を行う方法を理解していません。以下のコードで例と詳細な質問を示します。一部のデータが変更された後、どのようにTableViewを更新するのですか?

+0

あなたのアーキテクチャはどのようにこのリストが更新されつつある(なぜこのためappdelegateでVARを保持する)かなり未組織と悪いのですか?アップデートを確認するネットワークの発信者は誰ですか? – JDM

答えて

1

通知を使用できます。追加のviewDidLoadで、その後

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "UserlistUpdate"), object: nil) 

NotificationCenter.default.addObserver(self, selector: #selector(TableViewController.reloadData), name: NSNotification.Name(rawValue: "UserlistUpdate"), object: nil) 

P.S.をユーザリストが更新されるたびに、このような通知を投稿これまでのアーキテクチャでは、TableViewControllerに、独自のユーザ配列を保持するのではなく、ネットワークの変数を保持させるようにしました。次に、AppDelegateで:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    // Override point for customization after application launch. 
    let network = Network() 

    // Access the TableViewController and set its network variable 
    let tableViewController = window!.rootViewController as! TableViewController 
    tableViewController.network = network 
+0

この方法は、通知にそれぞれ登録できるように、複数のものがユーザーリストの変更に応答できる場合に便利です。 {(){ } 静的レットsharedInstance = MyClassの() 民間のinit} ' –

+0

は、建築用として、私はシングルトンのアプローチを提案するかもしれませんユーザリストの更新に応答する。複数のものが応答する場合は、通知を使用する方が良いかもしれません –

1

@JDMがコメントに記載されているように、あなたのアーキテクチャは混乱しています。
プロトコルを使用して、この委任を行うようにしてください:

// Network.swift 
protocol UsersUpdatedProtocol { 
    func usersListUpdated(list: [User]) 
} 
class Network { 
    var userList: [User] = [] { 
    didSet { 
     delegate?.usersListUpdated(list: userList) 
    } 
    } 
    var delegate: UsersUpdatedProtocol? 
    init(delegate d: UsersUpdatedProtocol) { 
    super.init() 
    delegate = d 
    } 
} 

// File TableViewController.swift 
class TableViewController: UITableViewController, UsersUpdatedProtocol { 
    var userList: [User] = [] 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    let _ = Network(delegate: self) 
    } 
    func usersListUpdated(list: [User]) { 
    self.userList = list 
    self.tableView.reloadData() 
    } 
} 
+1

ただ一つのことが起こっている場合は、このソリューションが動作するパブリッククラス' MyClassの: –

関連する問題