ios - 我如何获取数据并在 viewdidload 中使用它......而不是在函数内部?

标签 ios swift

我想打印从viewDidLoad获取的数据。 我不想从自定义函数本身打印它。 当我在 viewDidLoad 中调用 fetch 函数时。它应该获取所有数据。 之后我应该能够从 viewDidLoad 本身或任何地方访问或打印该数据。

class ContactViewController: UIViewController {


@IBOutlet var lblEmail: UILabel!
@IBOutlet var lblLocation: UILabel!
@IBOutlet var mapUIView: UIView!

var email = String()
var location = String()
var lati = Double()
var long = Double()


override func viewDidLoad() {
    super.viewDidLoad()


    self.fetchData()
    print(email)
    self.lblEmail.text = self.email


}

func fetchData(){

    let manager = APIManager()
    manager.parsingGet(url: BaseURL.contact) { (JSON, Status) in

        if Status {
            let dict = JSON.dictionaryObject
            let data = dict!["data"] as! [String:Any]

           // let lat = data["latitude"] as! Double
           // let lon = data["longitude"] as! Double
            let mail = data["email"] as! String
            let loc = data["location"] as! String

            DispatchQueue.main.async {

                self.email = mail
                self.location = loc
               // self.lati = lat
               //self.long = lon

            }


        }


    }


}


}

最佳答案

您无法打印从 viewDidLoad() 方法中的 API 响应获取的任何数据,因为 viewDidLoad() 方法中指定的所有代码行都会连续执行,不会等待您的 API 调用完成。

即使您有一个快速的服务器,也需要几毫秒的时间才能访问您的 API 并获得响应。届时,您的编译器将使用 viewDidLoad() 方法执行所有代码行。

因此,您不妨在 fetchData() 方法中打印 DispatchQueue.main.async 中的数据。

您可以尝试使用回调函数。这可能是实现您想要的目标的可能方法。尝试这样的事情......

override func viewDidLoad() {
    super.viewDidLoad()


    getData(completion:{ result in
    print(email)
    self.lblEmail.text = self.email
})


}

func getData(completion: (Bool)->()) {
    if status{
        let dict = JSON.dictionaryObject
        let data = dict!["data"] as! [String:Any]
        let mail = data["email"] as! String
        let loc = data["location"] as! String

        DispatchQueue.main.async {

            self.email = mail
            self.location = loc
            completion(true)

        }

    } else {
        completion(false)
    }
}

关于ios - 我如何获取数据并在 viewdidload 中使用它......而不是在函数内部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56071919/

相关文章:

swift - 在主(ContentView)SwiftUI View 中将 MKMapView 元素作为 UIViewRepresentable 访问

ios - UIAlertController 中的组或分隔符与新的音乐应用程序一样

ios - 边界功能不会阻止 Sprite 离开

iOS heightForRowAtIndexPath 正确计算方式

ios - Realm 是否支持 iOS 中的 LIMIT 查询?

ios - 从 CoreData 检索 NSDate 并将其设置为 Swift 中的 NSDate 变量

swift - 如何显示来自已知图像路径的图像 - SwiftUI

ios - 如何在 Objective c 中运行后台进程/多线程进程以获得更好的应用程序性能

ios - 使用 NSSortDescriptor 在 iOS 中对包装对象数组进行排序

ios - 将请求 header 添加到 WKWebView 中的所有传出请求