【问题标题】:Getting user's complete information using TwitterKit使用 TwitterKit 获取用户的完整信息
【发布时间】:2017-12-13 04:17:48
【问题描述】:

我正在使用this API 获取用户的关注者列表,并按照文档中的描述以 JSON 格式返回关注者。这是返回对象的 sn-p:

{
  "users": [
    {
      "id": 2960784075,
      "id_str": "2960784075",
      "name": "Jesus Rafael Abreu M",
      "screen_name": "chuomaraver",
      "location": "",
      "profile_location": null,
      "url": null,
      "description": "",
      "protected": false,
      "followers_count": 1,
      "friends_count": 101,
      "listed_count": 0,
      "created_at": "Sun Jan 04 19:58:06 +0000 2015",
      .....
      .....
      "default_profile": true,
      "default_profile_image": false,
      "following": false,
      "follow_request_sent": false,
      "notifications": false,
      "muting": false
    },
    .....
    .....
],
  "next_cursor": 1489467234237774933,
  "next_cursor_str": "1489467234237774933",
  "previous_cursor": 0,
  "previous_cursor_str": "0"
}

如您所见,用户对象有很多属性,我不想这样做 一个一个地解析它们,或者使用一个库来为我做这些。

TwitterKit 有一个名为 TWTRUser 的类,这里是 documentation。要初始化这个类的一个对象,你可以使用一个像这样接受 JSON 字典的构造函数:

let follower = TWTRUser(jsonDictionary: jsonDictionary)

这样我可以得到解析后返回给我的 JSON 对象并初始化 TWTRUser 对象。

问题是TWTRUser没有返回JSON中列出的所有属性,它只有documentation中列出的这些属性:

userID 属性
名称属性
screenName 属性
已验证 物业
受保护的财产
profileImageURL 属性
profileImageMiniURL 属性
profileImageLargeURL 属性
formattedScreenName 属性
profileURL 属性

我尝试使用 valueForKey 方法,该方法接受一个键并返回它的值,如下所示:

let createdAt = follower.value(forKey: "created_at")

我认为它会起作用,但它没有。当我使用它时,应用程序崩溃并给我以下消息:

由于未捕获的异常“NSUnknownKeyException”而终止应用程序, 原因:'[valueForUndefinedKey:]:这个类 不符合关键贡献者的关键值编码。'

如何使用TWTRUser 类获取所有用户的属性?

【问题讨论】:

  • 显示您尝试过的代码?
  • 你在哪里使用contributors_enabled
  • @AbhishekJain 我提到我尝试使用TWTRUservalueForKey 方法,我还说我可以通过原生方式或使用库来解析 JSON但我正在寻找另一种解决方案。
  • @Anbu.Karthik 是的,我试过了,也是同样的崩溃。

标签: ios swift twitterkit


【解决方案1】:

value(forKey:) 是与NSObject 继承的方法,它用于Key-Value Coding,因此它不会返回 JSON 的结果。 TWTRUser 类只定义了 10 个属性,这就是你能得到的全部。如果您想获取其他属性,则必须使用以下代码行自己解析 JSON(使用标准库)

let user = try JSONSerialization.jsonObject(with: jsonDictionary) as? [String: Any]

【讨论】:

    【解决方案2】:

    首先,就像已经提到的那样,不要使用value(for key),如果对象具有该值,它可能会通过公共属性公开它。

    我的建议是继承TWTRUser,将你想要的属性添加到你的新类(你可以称之为TwitterUser)并覆盖init(json),在那里你可以看到字典是否包含你的值想要并将它们添加到对象中。

    之后,您将能够像访问 TWTRUser 类中的任何其他属性一样访问这些属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-01
      • 2018-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      • 2020-09-07
      • 1970-01-01
      相关资源
      最近更新 更多