2015-05-14 3 views
3

Я использую Twitter-Kit/Fabric, чтобы получить ответ от twitter api. Он возвращает JSON в следующем формате - https://dev.twitter.com/rest/reference/get/search/tweetsParsing twitter api JSON in Swift

Мой запрос - https://api.twitter.com/1.1/search/tweets.json?q=""&geocode=lat,long,radius&count=15

Мне нужно извлечь текст и координаты из JSON, чтобы построить эти твиты на карте.

Что я делаю неправильно со следующим кодом -?

Twitter.sharedInstance().APIClient.sendTwitterRequest(request) { 
        (response, data, connectionError) -> Void in 
     if (connectionError == nil) { 
      var jsonError : NSError? 
      let parsedResult = 
      NSJSONSerialization.JSONObjectWithData(data, 
          options: nil, 
          error: &jsonError) as NSDictionary 
      println(parsedResult) 
      if let tweets = parsedResult["statuses"] as? NSDictionary { 
       for tweetsDict in tweets { 
        let title = tweetsDict["text"] as NSString 
        println("text: \(title)") 
        let coordinates = tweetsDict["coordinates"] 
        println("coordinates: \(coordinates)\n") 
       } 
      }else { 
        println("Error: \(connectionError)") 
      } 

     } 

Мой код работает до Println (parsedResult), как я получаю правильный ответ от API твиттер. Однако у меня возникли проблемы с извлечением твитового текста из ответа JSON.

+0

Вам нужно пройти аутентификацию до этого? Я получаю сообщение об ошибке: данные Bad Authentication. (код 215)}) –

+0

Я просто хочу запросить $ AAPL, например. Я не хочу публиковать или просматривать хронологию пользователей. Я должен быть в состоянии сделать это с помощью Fabric, не делая логин пользователя или что-то в этом роде? –

ответ

0

Существует небольшая ошибка с вами кодом Используйте этот код он работает лучше для меня, установите этот код в определенной функции на кнопку действия

Twitter.sharedInstance().APIClient.sendTwitterRequest(request) { 
        (response, data, connectionError) -> Void in 
     if (connectionError == nil) { 
      var jsonError : NSError? 
      let parsedResult = 
      NSJSONSerialization.JSONObjectWithData(data, 
          options: nil, 
          error: &jsonError) as NSDictionary 
      println(parsedResult) 
      if let tweets = parsedResult["status"] as? NSDictionary { 
       println(tweets) 
       for tweetsDict in tweets { 
        let title = tweetsDict["text"] as NSString 
        println("text: \(title)") 
        let coordinates = tweetsDict["coordinates"] 
        println("coordinates: \(coordinates)\n") 
       } 
      }else { 
        println("Error: \(connectionError)") 
      } 

     } 
+0

Привет! Можете ли вы указать на ошибку в моем коде? Мне нужно понять, что я делаю неправильно. – rkmr

+0

, чтобы поделиться и опубликовать твит, сначала вам нужно начать сеанс Twitter, чтобы приложение подтвердило, что пользователь является логином –

+0

Я уже это делаю. У меня анонимная сессия, и это происходит в другой части кода. Я получаю действительный ответ от twitter api, и код работает до println (parsedResult). Тем не менее, он разбирает json для текста и координат, с которыми у меня возникают проблемы. – rkmr

3

Если вы используете Fabric, вы можете создавать объекты ЧИРИКНУТЬ из ответ, используя метод TWTRTweet

+ (NSArray *)tweetsWithJSONArray:(NSArray *)array; 

Это создает массив TWTRTweet экземпляров из массива Twitter API JSON ответ.

NSArray *tweetData = [TWTRTweet tweetsWithJSONArray:responseFromTwitter]; 
[tableview reloadData]; 

Вы можете использовать объекты ЧИРИКНУТЬ для заполнения в Tableview в cellForRowAtIndexPath. Чтобы вернуть твит клетку,

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellID = @"TweetCell"; 


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath]; 

     TWTRTweet *tweet = twitterResponse[indexPath.row]; 
     [(TWTRTweetTableViewCell *)cell configureWithTweet:tweet]; 

    return cell; 
} 

EDIT

В Swift, вы можете сделать, как:

// Create an array of tweet model objects from a JSON array 
tweetData = TWTRTweet.tweetsWithJSONArray(responseFromTwitter) 
tableView.reloadData() 

//create Tweet cells 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let tweet = tweetData[indexPath.row] 
     let cell = tableView.dequeueReusableCellWithIdentifier(tweetTableReuseIdentifier, forIndexPath: indexPath) as TWTRTweetTableViewCell 
     cell.configureWithTweet(tweet) 

     return cell 
    } 

Надеется, что это помогает!

Reference taken from here

+0

Привет! Совсем не знакомы с Objective C, так как я начинаю разработку iOS и начинаю использовать Swift. Можете ли вы объяснить с помощью быстрого кода? – rkmr

+0

@rkmr Я добавил код для быстрого доступа. – NightFury

+0

Это может работать, но ограничено по функциональности. т. е. вы не можете перезагружать старые твиты, не создавая собственный класс контроллера. Я бы предложил TWTRTimelineViewController. Хотя это и не идеально, и я открыл здесь несколько проблем: https://twittercommunity.com/t/6-twtrtimelineviewcontroller-issues/51534 –