Swift, как я могу поделиться результатами API во всем приложении? - PullRequest
0 голосов
/ 08 января 2019

Мне нужно запросить у какого-нибудь API, чтобы получить: пользовательские данные, пользовательские подписки, подписчики пользователей. Это 3 разных API. Мне нужно звонить им каждые 1 минуту. Я поместил эту часть кода в свое приложение делегат , и у меня нет никаких проблем с этим. но мне нужно обновить ViewController, в котором пользователь уже находится, при получении новой информации с сервера. Мне нужно что-то вроде RXSwift , чтобы подписаться на новые данные и обновлять представление при появлении новых данных. Но я не знаю, как это сделать. Потому что мой вызов API находится в приложении делегат , а пользователь может быть в любом ViewController.

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Вы можете использовать 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)
0 голосов
/ 08 января 2019

Если вам нужно сообщить N экземплярам об ответе API, вы можете использовать NotificationCenter или KVO, а если вам нужен только доступ к результату API через приложение, то вы можете используйте Singleton (если данные временно требуются) или Постоянное хранилище (если данные должны храниться постоянно), например 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)!")
                }
            }
        }
0 голосов
/ 08 января 2019

Я не знаю 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)!")
        }
    }
}
...