2017-07-25 15 views
-4

私は、単にcompletionHandlerを使用してリクエストから情報を取得しようとしています。問題は、コードの他の部分のすべての情報を配列に格納する必要があることです。アクセスできないようです。文字列型に値型 '()'を代入できませんか?

private func loadUserData(completionHandler: @escaping ([String]) ->()) { 
    // 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) 

        completionHandler(self.userData) 
      } 
     } 
    } 
} 

func manageUserData(index: Int) { 
    loadUserData() {_ in 
     return self.userData[index] 
    } 
} 

そして、私は、データがそれを表示することを必要な場所ここにある:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let rowNumber = indexPath.row 
    let cellIdentifier = "TableViewCell" 
    guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? TableViewCellController else { 
     fatalError("The dequeued cell is not an instance of TableViewCellController.") 
    } 

    switch rowNumber { 
     case 0: 
      cell.titlePlaceholder.text = "Name:" 
      cell.valuePlaceholder.text = manageUserData(index: 1) 

をエラーが発生することがあります。この最後の行では:私は、データへのアクセスをどこここにある「asignはできません。データを取得してコードの別の部分からアクセスできるようにするために、私がcompletionHandlerを正しく使用しているかどうかわかりません。

何か考えてください? ありがとうございました!

私はきちんとcompletionHandlerを使用していませんでした

UPDATE 。だから私のmanageUserData機能は次のようになります

private func loadUserData(completion: @escaping (_ myArray: [String]) -> Void) 

func manageUserData() { 
    loadUserData { 
     (result: [String]) in 
     self.secondUserData = result 
    } 
} 

・ホープ、このことができますので、私はでそれを変更しました!

+0

あなたが期待するものは不明です。 'func manageUserData(index:Int)'は値を返しません。したがって、ラベルの 'text'にそれを"割り当てる "ことはできません。テキストではありません。これは文字列ではありません。それは空(値なし)です。 – matt

答えて

1

これは非同期ネットワークコールなので、データをリロードする必要があるかどうかによって、VCのviewWillAppearviewDidAppear、またはviewDidLoadでこのコールを開始する必要があります。

override func viewWillAppear(_ animate: Bool) { 
    super.viewWillAppear(animate) 
    sessionManager.loadUserData { (strings) in 

    } 
} 

は、コールが完了したときに実行されますあなたのloadUserDataクロージャの内部で、のtableViewのデータソースとして使用し、配列にデータをロードし、あなたのcellForRowあなたのため次にtableView.reloadData()

sessionManager.loadUserData { (strings) in 
    self.dataSource = strings 
    self.tableView.reloadData() 
} 

を呼ぶだろうちょうど必要があります。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let rowNumber = indexPath.row 
    let cellIdentifier = "TableViewCell" 
    guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? TableViewCellController else { 
     fatalError("The dequeued cell is not an instance of TableViewCellController.") 
    } 

    switch rowNumber { 
     case 0: 
      cell.titlePlaceholder.text = "Name:" 
      cell.valuePlaceholder.text = dataSource[0] 
    } 
} 

あなたnumberOfRowsがを返していることを確認してください0

関連する問題