Swift,如何在我的整个应用程序中共享API结果?

时间:2019-01-08 08:51:14

标签: ios swift rx-swift

我需要请求一些API,以获取:用户数据,用户关注者,用户关注者。它们是3个不同的API。我需要每1分钟给他们打电话。我将这部分代码放入我的应用程序 delegate 中,我对此没有任何问题。但是无论何时从服务器获取新信息,我都需要刷新用户已经在其中的ViewController。我需要类似 RXSwift 的东西来订阅新数据并在有新数据可用时更新视图。但是我不知道该怎么做。因为我的API调用位于应用程序 delegate 中,并且用户可以位于任何ViewController中。

3 个答案:

答案 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响应的信息,则可以使用NotificationCenterKVO,而您只需要通过以下方式访问API结果:应用程序,则可以使用 Singleton (如果临时需要数据)或 Persistence Storage (如果要永久存储数据),例如NSUserDefaultsSQLiteCoreData

@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)!")
                }
            }
        }