Ios 如何在swift中从另一个类调用方法

Ios 如何在swift中从另一个类调用方法,ios,swift,Ios,Swift,我有一个带有collectionView的viewcontroller类viewcontroller。此外,我还有用于从facebook获取数据的singleton类FacebookManager 我想做的是在facebook类中运行一个方法,然后在ViewController中调用一个方法来重新加载collectionView 我试图通过设置 class FacebookManager { static let sharedInstance = FacebookManager()

我有一个带有collectionView的viewcontroller类
viewcontroller
。此外,我还有用于从facebook获取数据的singleton类
FacebookManager

我想做的是在facebook类中运行一个方法,然后在ViewController中调用一个方法来重新加载collectionView

我试图通过设置

class FacebookManager  {
   static let sharedInstance = FacebookManager()
   var vc:ViewController?
}
然后在ViewController中进行设置

class ViewController: {
   func viewDidLoad() {
      FacebookManager.sharedInstance.vc = self
   }
}
然后打电话给FacebookManager

func myMethod() {
   vc.collectionView.reloadData()
}
但这不起作用


如何正确执行此操作?

要在两个或多个类之间提供通信,建议使用两种方法。 1) 授权 2) 通知

在实现委派方法的给定代码中,我们必须在FacebookManager中创建协议和委派属性。并将视图控制器作为委托分配给FaceBookManager

例如:

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()
  }
}
但您使用的是singleton类,所以将来多个类将使用这个类,如果您想通知多个类,请使用Notification方法,这非常容易实现,应该在singleton类中使用

在FaceBookManager中发布通知,只要您想通知:

 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()
   }
 }

由于
FacebookManager
是一个单例,可以从任何地方访问,因此调用该方法从包含集合视图的控制器获取数据。是的,但是如何从FacebookManager调用ViewController?使用委托方法或完成块。什么是
ViewDidLoad()
?你问题中的代码是无效的,“但这不起作用”是非常模糊的。请详细说明哪些不起作用,以及您试图使其起作用的方法。您没有提到最方便的方法:3)回调/完成块