Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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 数组在完成方法之前为空吗_Ios_Arrays_Swift - Fatal编程技术网

Ios 数组在完成方法之前为空吗

Ios 数组在完成方法之前为空吗,ios,arrays,swift,Ios,Arrays,Swift,我犯了一个找不到的错误。数组(类级别)在返回之前变为空 private func loadUserData() { // We're getting user info data from JSON response let session = Twitter.sharedInstance().sessionStore.session() let client = TWTRAPIClient.withCurrentUser() let userInfoURL =

我犯了一个找不到的错误。数组(类级别)在返回之前变为空

private func loadUserData() {
    // We're getting user info data from JSON response
    let session = Twitter.sharedInstance().sessionStore.session()
    let client = TWTRAPIClient.withCurrentUser()
    let userInfoURL = "https://api.twitter.com/1.1/users/show.json"
    let params = ["user_id": session?.userID]
    var clientError : NSError?
    let request = client.urlRequest(withMethod: "GET", url: userInfoURL, parameters: params, error: &clientError)
    client.sendTwitterRequest(request) { (response, data, connectionError) -> Void in
        if connectionError != nil {
            print("Error: \(connectionError)")
        }

        do {
            let json = JSON(data: data!)
            if let userName = json["name"].string,
                let description = json["description"].string,
                let followersCount = json["followers_count"].int,
                let favouritesCount = json["favourites_count"].int,
                let followingCount = json["friends_count"].int,
                let lang = json["lang"].string,
                let nickname = json["screen_name"].string {

                self.userData.append(userName)
                self.userData.append(description)
                self.userData.append(String(followersCount))
                self.userData.append(String(favouritesCount))
                self.userData.append(String(followingCount))
                self.userData.append(lang)
                self.userData.append(nickname)
                print(self.userData)
            }

        }
    }
    print(userData)
}
我只是试图从代码的其他部分访问它的值,但由于它变为空,所以无法访问它。我可以在第一次打印时看到数组数据,但在第二次打印时看不到。
多谢各位

客户端。sendTwitterRequest
是一个需要网络连接的异步请求。这需要时间来处理

您应该提供一个返回
userData
的闭包,并在请求返回时访问它

private func loadUserData(_ callback: @escaping () -> ()) {
    // We're getting user info data from JSON response
    let session = Twitter.sharedInstance().sessionStore.session()
    let client = TWTRAPIClient.withCurrentUser()
    let userInfoURL = "https://api.twitter.com/1.1/users/show.json"
    let params = ["user_id": session?.userID]
    var clientError : NSError?
    let request = client.urlRequest(withMethod: "GET", url: userInfoURL, parameters: params, error: &clientError)
    client.sendTwitterRequest(request) { (response, data, connectionError) -> Void in
        if connectionError != nil {
            print("Error: \(connectionError)")
        }

        do {
            let json = JSON(data: data!)
            if let userName = json["name"].string,
                let description = json["description"].string,
                let followersCount = json["followers_count"].int,
                let favouritesCount = json["favourites_count"].int,
                let followingCount = json["friends_count"].int,
                let lang = json["lang"].string,
                let nickname = json["screen_name"].string {

                self.userData.append(userName)
                self.userData.append(description)
                self.userData.append(String(followersCount))
                self.userData.append(String(favouritesCount))
                self.userData.append(String(followingCount))
                self.userData.append(lang)
                self.userData.append(nickname)

                callback()     
            }
        }
    }
}

func manageUserData() {
    loadUserData() {
        print(userData)
    }
}

client.sendTwitterRequest
是一个需要网络连接的异步请求。这需要时间来处理

您应该提供一个返回
userData
的闭包,并在请求返回时访问它

private func loadUserData(_ callback: @escaping () -> ()) {
    // We're getting user info data from JSON response
    let session = Twitter.sharedInstance().sessionStore.session()
    let client = TWTRAPIClient.withCurrentUser()
    let userInfoURL = "https://api.twitter.com/1.1/users/show.json"
    let params = ["user_id": session?.userID]
    var clientError : NSError?
    let request = client.urlRequest(withMethod: "GET", url: userInfoURL, parameters: params, error: &clientError)
    client.sendTwitterRequest(request) { (response, data, connectionError) -> Void in
        if connectionError != nil {
            print("Error: \(connectionError)")
        }

        do {
            let json = JSON(data: data!)
            if let userName = json["name"].string,
                let description = json["description"].string,
                let followersCount = json["followers_count"].int,
                let favouritesCount = json["favourites_count"].int,
                let followingCount = json["friends_count"].int,
                let lang = json["lang"].string,
                let nickname = json["screen_name"].string {

                self.userData.append(userName)
                self.userData.append(description)
                self.userData.append(String(followersCount))
                self.userData.append(String(favouritesCount))
                self.userData.append(String(followingCount))
                self.userData.append(lang)
                self.userData.append(nickname)

                callback()     
            }
        }
    }
}

func manageUserData() {
    loadUserData() {
        print(userData)
    }
}

通过扩展@4kman答案解释OP的问题。

您的代码处于分派/阻止状态。一段时间后调用分派/块

因此,您的第一次打印立即被调用,此时
userdata
为空。但在第二种情况下,在块中调用print,并将数据分配给
userData
。因此,当调用第二次打印时,
userdata
具有值

请检查下面的代码,我提到的第一个和第二个打印,它被相应地调用

实际上,在打印行上都放置断点,并检查何时调用哪一行

let request = client.urlRequest(withMethod: "GET", url: userInfoURL, parameters: params, error: &clientError)
client.sendTwitterRequest(request) { (response, data, connectionError) -> Void in
    if connectionError != nil {
        print("Error: \(connectionError)")
    }

    do {
        let json = JSON(data: data!)
        if let userName = json["name"].string,
            let description = json["description"].string,
            let followersCount = json["followers_count"].int,
            let favouritesCount = json["favourites_count"].int,
            let followingCount = json["friends_count"].int,
            let lang = json["lang"].string,
            let nickname = json["screen_name"].string {

            self.userData.append(userName)
            self.userData.append(description)
            self.userData.append(String(followersCount))
            self.userData.append(String(favouritesCount))
            self.userData.append(String(followingCount))
            self.userData.append(lang)
            self.userData.append(nickname)
            print(self.userData) // 2. print second
        }

    }
}
print(userData) // 1. print first
}
对@4kman答案的解释

他使用了回调,即当您在被调用函数中收到数据时,回调用于获取调用函数中的数据。作为回答,他不使用任何参数,但您可以发送您的数组

注意在调用的函数中,您可以获取块中的数据。因此,要像您的情况一样在块中获取数据,您必须使用completionhandler

请参阅:

编辑

在func中,进行如下更改

func loadUserData( completion: (myArray: [String]) -> Void) { // my array is array of string. Assuming you'r passing array of string from closure.

// Write the below line where you wanted to call callback or return through closure. 
// Recommandated to use below line in second print.

    completion(userData) // 'userData' is the array which you wanted to pass from closure.

}
如何调用闭包

loadUserData {
    (result: [String]) in
    print("got back: \(result)")
}

注意:您可能需要将闭包更改为
@escaping
,因为此x代码为您提供了建议。所以先试试我的编辑答案。

通过扩展@4kman答案来解释OP的问题。

您的代码处于分派/阻止状态。一段时间后调用分派/块

因此,您的第一次打印立即被调用,此时
userdata
为空。但在第二种情况下,在块中调用print,并将数据分配给
userData
。因此,当调用第二次打印时,
userdata
具有值

请检查下面的代码,我提到的第一个和第二个打印,它被相应地调用

实际上,在打印行上都放置断点,并检查何时调用哪一行

let request = client.urlRequest(withMethod: "GET", url: userInfoURL, parameters: params, error: &clientError)
client.sendTwitterRequest(request) { (response, data, connectionError) -> Void in
    if connectionError != nil {
        print("Error: \(connectionError)")
    }

    do {
        let json = JSON(data: data!)
        if let userName = json["name"].string,
            let description = json["description"].string,
            let followersCount = json["followers_count"].int,
            let favouritesCount = json["favourites_count"].int,
            let followingCount = json["friends_count"].int,
            let lang = json["lang"].string,
            let nickname = json["screen_name"].string {

            self.userData.append(userName)
            self.userData.append(description)
            self.userData.append(String(followersCount))
            self.userData.append(String(favouritesCount))
            self.userData.append(String(followingCount))
            self.userData.append(lang)
            self.userData.append(nickname)
            print(self.userData) // 2. print second
        }

    }
}
print(userData) // 1. print first
}
对@4kman答案的解释

他使用了回调,即当您在被调用函数中收到数据时,回调用于获取调用函数中的数据。作为回答,他不使用任何参数,但您可以发送您的数组

注意在调用的函数中,您可以获取块中的数据。因此,要像您的情况一样在块中获取数据,您必须使用completionhandler

请参阅:

编辑

在func中,进行如下更改

func loadUserData( completion: (myArray: [String]) -> Void) { // my array is array of string. Assuming you'r passing array of string from closure.

// Write the below line where you wanted to call callback or return through closure. 
// Recommandated to use below line in second print.

    completion(userData) // 'userData' is the array which you wanted to pass from closure.

}
如何调用闭包

loadUserData {
    (result: [String]) in
    print("got back: \(result)")
}

注意:您可能需要将闭包更改为
@escaping
,因为此x代码为您提供了建议。所以,首先试试我的编辑答案。

你是否分配了
self.userData
数组?你是什么意思?userData位于类的顶部。在追加/使用
self.userData
之前,我们需要分配该对象。您分配了
self.userData
数组了吗?您是什么意思?userData位于类的顶部。在追加之前/在使用
self.userData
之前,我们需要分配该对象。正如您所说,我已经检查了它,并按照您提到的顺序调用打印。那么我该如何解决这个问题呢?@JavierSanzRozalén请检查我已经提到的最新答案。但是如果我想从任何地方返回该数组呢?我被卡住了,因为我从来没有使用过闭包,我是Swift的新手。很抱歉一直问你。@JavierSanzRozalén没关系,伙计,我们很乐意帮助你。问问你在哪里卡住了。闭包使用起来很简单。@JavierSanzRozalén在我的答案底部检查我的编辑asnwer。正如你所说,我已经检查过了,打印的内容是按照你提到的顺序调用的。那么我该如何解决这个问题呢?@JavierSanzRozalén请检查我已经提到的最新答案。但是如果我想从任何地方返回该数组呢?我被卡住了,因为我从来没有使用过闭包,我是Swift的新手。很抱歉一直问你。@JavierSanzRozalén没关系,伙计,我们很乐意帮助你。问问你在哪里卡住了。闭包使用起来很简单。@JavierSanzRozalén在我的答案底部检查我的编辑asnwer。