2017-07-25 34 views
1

我犯了一个我找不到的错误。数组(类级别)在返回之前变空。完成该方法之前的阵列空

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) 
} 

我只是试图从代码的其他部分访问它的值,并且因为它变空而无法执行它。第一次打印时我可以看到阵列数据,但在第二次没有。 非常感谢!

+0

你分配了'self.userData'数组吗? –

+0

你是什么意思? userData位于类的顶部。 –

+0

之前追加/使用'self.userData'我们需要分配该对象。 –

回答

1

通过扩展@the4kman答案解释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 
} 

的@说明the4kman回答

他用回调即回调用于当你在调用的函数接收到的数据来获得在调用函数中的数据。在这里回答他没有使用任何参数,但您可以发送您的数组。

注意在你调用的函数中,你在块中获取数据。所以为了像你的情况一样获取块内的数据,你必须使用completionhandler。

请大家参考:

How does a completion handler work on iOS?

编辑

在你的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-代码给你的建议。所以首先尝试我的编辑答案。

+0

正如你所说,我已经检查过它,并按照你提到的顺序调用打印件。那么我怎么能解决这个问题呢? –

+0

@JavierSanzRozalén请检查我已经提到的更新回答。 –

+0

但是如果我想从任何地方返回该数组呢?因为我从来没有使用过闭包,所以我陷入困境,而我是Swift的新手。抱歉保持询问。 –

3

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) 
    } 
} 
+0

仍然有同样的问题。在我发布的代码片段中,我第一次打印数组时没有问题,但是在第二次。任何想法 ? –

相关问题