我可以在swift中从后台队列中调用静态方法吗?

时间:2018-05-18 11:36:13

标签: ios swift multithreading background

我在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时发生此问题。我正在使用名为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 :(得分:2)

您可以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)
    })
}

答案 1 :(得分:0)

有几个原因可以让我想象出任何影响:
1.在某些时候,getData会修改用户界面,我认为这不是个案 2. getData修改外部的任何变量。因此,您需要将这些修改包装在同步队列中 3. getData调用其他变异方法。解决方案与2中的解决方案相同 否则,从任何地方调用静态方法都是安全的。除非您需要为呼叫设置额外的设置,否则不需要使用Singleton方法。

答案 2 :(得分:-3)

是的,您可以在后台线程中调用静态方法。

onActivityCreated