Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何获取数据并在viewdidload中使用它…而不是在函数内部?_Ios_Swift - Fatal编程技术网

Ios 如何获取数据并在viewdidload中使用它…而不是在函数内部?

Ios 如何获取数据并在viewdidload中使用它…而不是在函数内部?,ios,swift,Ios,Swift,我想打印从viewDidLoad获取的数据。 我不想从自定义函数本身打印它。 当我在viewDidLoad中调用fetch函数时,它应该获取所有数据。 在那之后,我应该能够从viewDidLoad本身或任何地方访问或打印数据 class ContactViewController: UIViewController { @IBOutlet var lblEmail: UILabel! @IBOutlet var lblLocation: UILabel! @IBOutlet var mapU

我想打印从
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)
    }
}

parsingGet
异步工作。解决方案非常简单:在API的完成处理程序中为标签赋值

override func viewDidLoad() {
    super.viewDidLoad()
    self.fetchData()
}

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

            self.email = mail
            self.location = loc
            print(mail)

            DispatchQueue.main.async {    
                self.lblEmail.text = mail
            }
        }
    }
}

相关:为什么您坚持在
viewDidLoad
返回之前获取所有数据?从互联网获取数据需要时间。