Можно ли вызвать статический метод из фоновой очереди в swift? - PullRequest
0 голосов
/ 18 мая 2018

У меня есть статический getData() метод в классе ServerCommunication, я могу вызвать этот метод из фоновой очереди.

//ServerCommunication.swift

import UIKit
import Foundation


class ServerCommunication
{
      class func getData(url: String, sessionId: String) -> ServerResponse {
            //server communication code goes here
      }
}

func populateData() {
     DispatchQueue.global(qos: .background).async {
           let response = ServerCommunication.getData(url: URL, sessionId: "")
     }
}

Кто-нибудь может объяснить, как это повлияет на выполнение потоков? Или мне нужно определить класс ServerCommunication как Singleton?

Статический класс getData () выполняется несколько раз, когдавызов из фоновой очереди

# Edit1 Еще несколько объяснений

Эта проблема возникла, когда я пытаюсь открыть определенный viewController при получении push-уведомления.Я использую стороннюю библиотеку под названием FAPanelController , которая принимает центральный, левый и правый viewController соответственно.

Пример кода:

@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
//Now I want to open a viewController
if let panel = self.window?.rootViewController as? FAPanelController     
{
    let centerNavVC = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! UINavigationController
        let vc = centerNavVC.topViewController as! HomeViewController
        panel.center(centerNavVC, afterThat: {
            //HomeViewController has a method populateData() in viewWillAppear()
        })
}
}

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Есть несколько причин любого воздействия, которое я могу себе представить:
1. В какой-то момент ваш getData изменяет пользовательский интерфейс, что, как мне кажется, здесь не так.
2. getData изменяет любые переменные вне,Таким образом, вам нужно поместить эти изменения в синхронную очередь.
3. getData вызывает другие методы мутирования.Решение такое же, как в 2.
В противном случае безопасно вызывать статический метод из любого места.Подход Singleton не требуется, если вам не требуется дополнительная настройка для ваших вызовов.

0 голосов
/ 26 мая 2018

Вы можете использовать Closures для этого

class ServerCommunication
{
    class func getData(url: String, sessionId: String, success: @escaping ((_ responseObject: ServerResponse?) -> Void)) {
        //server communication code goes here
        success(serverData) // serverData is a server response
    }
}

func populateData() {
    ServerCommunication.getData(url: "", sessionId: "", success: { (response) in
       // You can handle response here
       print(response)
    })
}
0 голосов
/ 18 мая 2018

Да, вы можете вызывать статический метод в фоновом потоке.

ClassName.performSelector(inBackground: #selector(self.ClassMethod), with: nil)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...