我需要请求一些API,以获取:用户数据,用户关注者,用户关注者。它们是3个不同的API。我需要每1分钟给他们打电话。我将这部分代码放入我的应用程序 delegate 中,我对此没有任何问题。但是无论何时从服务器获取新信息,我都需要刷新用户已经在其中的ViewController
。我需要类似 RXSwift 的东西来订阅新数据并在有新数据可用时更新视图。但是我不知道该怎么做。因为我的API调用位于应用程序 delegate 中,并且用户可以位于任何ViewController
中。
答案 0 :(得分:2)
我不知道RX Swift,但是您所描述的是一个经典的NotificationCenter用例。
我会使用post
NotificationCenter
发出通知,并在我的视图控制器中进行订阅。
KVO是另一种解决方法,但考虑到您所描述的情况,我会附带通知。
示例:
// This class does the API stuff
class MyClass{
static let myNotification = Notification.Name("com.mycompany.intersting-notification")
func apiCall(){
NotificationCenter.default.post(name: MyClass.myNotification, object: "Hello!")
}
}
// in your view controller
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(forName: MyClass.myNotification, object: nil, queue: nil) { (notification) in
if let str = notification.object as? String {
print("Somebody sent us this: \(str)!")
}
}
}
答案 1 :(得分:1)
您可以如下使用NotificationCenter。您也可以使用Delegates,这是一个有关NotificationCenter Blog的好博客。希望对您有所帮助。
// In viewWillAppear
override func viewWillAppear(_ animated: Bool) {
NotificationCenter.default.addObserver(self,
selector:#selector(GetApiDetails), name:
NSNotification.Name(rawValue: "GetApiDetails"), object: nil)
}
// In viewWillDisappear
override func viewWillDisappear(_ animated: Bool) {
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "GetApiDetails"), object: nil)
}
// Get/Use your related api result in this function
@objc func GetApiDetails(notification: NSNotification){
// do your stuff here
}
// Now Call UserNotification Center method in your appdelegate file in a method and pass the values if you want to in your object like array or dictionary or according to your convenience.
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "GetApiDetails"), object: nil)
答案 2 :(得分:1)
如果您需要通知 N 个实例有关API响应的信息,则可以使用NotificationCenter
或KVO
,而您只需要通过以下方式访问API结果:应用程序,则可以使用 Singleton (如果临时需要数据)或 Persistence Storage (如果要永久存储数据),例如NSUserDefaults
, SQLite
或CoreData
@Moshe Gottlieb的示例
// API Class
class MyClass{
static let myNotification = Notification.Name("com.mycompany.intersting-notification")
// API Call
func apiCall(){
// on API completion, post(publish or send) a notification using the syntax
NotificationCenter.default.post(name: MyClass.myNotification, object: "Hello!")
}
}
// UIViewController / Any class initial load method
override func viewDidLoad() {
super.viewDidLoad()
// register or observe or listen for notification of name
NotificationCenter.default.addObserver(forName: MyClass.myNotification, object: nil, queue: nil) { (notification) in
// closure called when notification is received
if let str = notification.object as? String { // data fetched from notification
print("Somebody sent us this: \(str)!")
}
}
}