从委托的源ViewController调用异步闭包

时间:2018-09-24 01:58:16

标签: swift asynchronous delegates closures

我有以下设置:

Storyboard.main

  1. 启动VC 在闭包dataGatheringClosure

  2. 中执行异步API请求
  3. dataGatheringClosure闭包的完成处理程序使用协议方法setData通过委派将结果传递给 VC1

  4. setData内, VC1 使用以下代码将结果传递给 VC2

    if let vc2 = self.tabBarController?.viewControllers?[1] as? VC2Controller {
        vc2.data = result
    }
    

我能够将数据从启动VC 传输到 VC2 ,但是现在我需要通过在中执行dataGatheringClosure来刷新数据>启动VC

我的问题是:如何从 VC2 访问启动VC 的方法?这种方法听起来不错吗?

作为一种解决方法,我在{strong> TabBar VC 中复制了dataGatheringClosure关闭代码,并让 VC 2 调用了其self.tabBarController.dataGatheringClosure方法。但是,它是重复的,而且我也不知道在TabBarController内执行繁重的API请求是否是最佳实践。

1 个答案:

答案 0 :(得分:0)

第一步是将数据与ViewController分开。如下创建一个单例类,并使用它来传递所需的数据。

$('#month').html(data);

使用以下代码在应用启动时或需要的地方初始化数据:

<html>
<div id="mainContainer" onclick="toggleFullScreen(this)" style="width:100%; height: 100%" />
<script>
var mainContainer = document.getElementById("mainContainer");

function toggleFullScreen(divObj) {
	if (divObj.requestFullscreen)    
		if (document.fullScreenElement) { 
			document.cancelFullScreen();        
		} else { 
			divObj.requestFullscreen(); 
		} 
	else if (divObj.msRequestFullscreen) 
		if (document.msFullscreenElement) { 
			document.msExitFullscreen(); 
		} else { 
			divObj.msRequestFullscreen(); 
		} 
	else if (divObj.mozRequestFullScreen) 
		if (document.mozFullScreenElement) { 
			document.mozCancelFullScreen(); 
		} else { 
			divObj.mozRequestFullScreen(); 
		} 
	else if (divObj.webkitRequestFullscreen) 
		if (document.webkitFullscreenElement) { 
			document.webkitCancelFullScreen(); 
		} else { 
			divObj.webkitRequestFullscreen(); 
		} 
}

function changeHandler(){                        
	var fs = document.fullscreenElement || document.mozFullScreenElement || 	document.webkitFullscreenElement || document.msFullscreenElement;                               
	if (fs) {                                                              
		mainContainer.style.backgroundColor = "#3D5A80";
		mainContainer.style.paddingTop = "40px";               
	}                                                                      
	else {                                                                 
		mainContainer.style.backgroundColor = '';
		mainContainer.style.paddingTop = '';
	}                                                                      
}
   
document.addEventListener("fullscreenchange", changeHandler, false);      
document.addEventListener("webkitfullscreenchange", changeHandler, false);
document.addEventListener("mozfullscreenchange", changeHandler, false);
document.addEventListener("MSFullscreenChange", changeHandler, false);
</script>
</html>

您现在可以使用静态变量Data.shared从应用程序中的任何位置访问数据。要刷新数据,您可以执行以下操作:

class Data {

    static let shared = Data()
    // Declare any other data properties you need here...
    var result = [String]()

    private init() {}

    func initialize() {
        // Write code to initialize the data
        refresh()
    }

    func refresh() {
        // Write code to refresh the data
    }
}

希望这会有所帮助。