2016-08-17 20 views
1

私はviewControllerクラスViewControllerをcollectionViewに持っています。また、私はフェイスブックからデータを取得するためのシングルトンクラスFacebookManagerを持っています。すぐに別のクラスからメソッドを呼び出す方法

私がしたいのは、facebookクラスでメソッドを実行し、ViewControllerのメソッドを呼び出してcollectionViewを再読み込みすることです。

私はViewControllerを

class ViewController: { 
    func viewDidLoad() { 
     FacebookManager.sharedInstance.vc = self 
    } 
} 

に設定する。そしてFacebookManager

func myMethod() { 
    vc.collectionView.reloadData() 
} 

しかしこのdoesnの中で呼び出すその後

class FacebookManager { 
    static let sharedInstance = FacebookManager() 
    var vc:ViewController? 
} 

を設定することで、FacebookのマネージャでのViewControllerへの参照を作ってみました仕事はありません。

これを正しく行うにはどうすればよいですか?

+0

'FacebookManager'はシングルトンでありどこからでもアクセスできるので、コレクションビューを含むコントローラからデータをフェッチするメソッドを呼び出します。 – vadian

+0

はい、どうしたらFacebookManagerからViewControllerを呼び出すことができますか? –

+0

デリゲートメソッドまたは完了ブロックを使用します。 – vadian

答えて

0

2つまたは複数のクラス間の通信を提供するには、2つの方法が推奨されます。 1)委任 2)通知

委任方法を実装するコードでは、FacebookManagerでプロトコルと代理プロパティを作成する必要があります。そして

例FacebookManger

に委譲としてビューコントローラを割り当てる:

protocol FacebookManagerDelegate: class { 
    func refreshData() 
} 

class FacebookManager { 
    var weak delegate:FacebookManagerDelegate? 
    func myMethod() { 
    delegate?.refreshData() 
    } 
} 

class ViewController: FacebookManagerDelegate { 
    ViewDidLoad() { 
    FacebookManager.sharedInstance.delegate = self 
    } 

func refreshData() { 
    self.collectionView.reloadData() 
    } 
} 

しかし、あなたは、このクラスを使用することでしょうので、今後、複数のクラスにシングルトンクラスを使用していて、複数のクラスが、通知方法を使用通知したい場合は、これはかなり簡単に実装すると

はあなたが通知するFacebookMangerでポスト通知をいつでもシングルトンクラスで使用する必要があります:

class FacebookManager { 
    func myMethod() { 
    NSNotificationCenter.defaultCenter().postNotificationName(notificationName, object: nil) 
    } 
} 

class ViewController { 
    ViewDidLoad() { 
    NSNotificationCenter.defaultCenter().addObserver(self, selector:#selector(reloadData(_:)), name: NotificationName, object: nil) 
    } 
    deinit { 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 

func reloadData(notification: NSNotification) { 
    self.collectionView.reloadData() 
    } 
} 
+1

あなたは最も便利な方法は言及していませんでした:3)コールバック/補完ブロック – vadian

+0

もちろん、忘れてしまいました。ありがとう –

関連する問題