Swift 解析 Facebook Graph API 对象时出错:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP)
Posted
技术标签:
【中文标题】Swift 解析 Facebook Graph API 对象时出错:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP)【英文标题】:Swift error parsing Facebook Graph API object: EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP) 【发布时间】:2014-06-29 07:16:10 【问题描述】:我试图获取 Facebook 群组信息,但遇到了一个我不知道如何解决的错误。
当我尝试访问组的 Feed 的单个项目时,我将 Feed 从 AnyObject 转换为 FBGraphObject,这就是发生错误的地方。
错误显示 “线程 1 : EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP, subcode=0x0)”
我尝试进行 nil 检查,并检查对象的类型以防止错误,但并没有解决问题。
任何建议可能是什么问题?
func fetchFacebookGroup()
FBRequestConnection.startWithGraphpath("/\(groupId)/?fields=feed", completionHandler: (connection: FBRequestConnection!, result: AnyObject!, error: NSError!) -> Void in
if result?
NSLog("error = \(error)")
var jsonFeeds = result as FBGraphObject
self.feeds = self.buildFeeds((jsonFeeds["feed"] as FBGraphObject)["data"] as NSMutableArray)
self.tableView.reloadData()
as FBRequestHandler)
func buildFeeds(data: NSMutableArray) -> Array<GroupFeed>
var result : Array<GroupFeed> = []
for rawFeed : AnyObject in data
if rawFeed is FBGraphObject // This is where error pops up.
if let jsonFeed = rawFeed as? FBGraphObject
var feed = GroupFeed(id: jsonFeed["id"] as String, name: (jsonFeed["from"] as FBGraphObject)["name"] as String, message: jsonFeed["message"] as String, updatedTime: jsonFeed["updated_time"] as String)
result.append(feed)
return result
【问题讨论】:
【参考方案1】:我在解析 API 调用返回的 FBGraphObject 时更加小心,从而解决了这个问题。 事实证明,我假设此 API 返回的所有群组供稿都包含“消息”作为键是错误的。
因此,我的代码的固定版本如下:
TableViewController.swift
func fetchFacebookGroup()
FBRequestConnection.startWithGraphPath("\(groupId)/?fields=feed.limit=(1)", completionHandler: (connection: FBRequestConnection!, result: AnyObject!, error: NSError!) -> Void in
if result?
NSLog("error = \(error)")
var jsonFeeds = result as FBGraphObject
self.feeds = self.buildFeeds((jsonFeeds["feed"] as FBGraphObject)["data"] as NSMutableArray)
self.tableView.reloadData()
as FBRequestHandler)
func buildFeeds(data: NSMutableArray) -> Array<GroupFeed>
var result : Array<GroupFeed> = []
for rawFeed : AnyObject in data
if rawFeed is FBGraphObject
if let jsonFeed = rawFeed as? FBGraphObject
var feed = GroupFeed(jsonFeed: jsonFeed)
result += feed
return result
GroupFeed.swift
class GroupFeed: NSObject
var id : String!
var name : String!
var message : String?
var updatedTime : String!
init(jsonFeed: FBGraphObject)
self.id = jsonFeed["id"] as String
self.name = (jsonFeed["from"] as FBGraphObject)["name"] as String
if let message = jsonFeed.objectForKey("message") as? String
self.message = message
self.updatedTime = jsonFeed["updated_time"] as String
所以我在这里的教训是,我不应该过分依赖 XCode 调试器准确定位错误来自何处的能力。
我不知道这是因为 XCode6 仍处于测试阶段,还是它就是这样,但在测试 IDE 之上使用全新语言时,应注意不要盲目相信该工具.
【讨论】:
以上是关于Swift 解析 Facebook Graph API 对象时出错:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP)的主要内容,如果未能解决你的问题,请参考以下文章
Facebook Graph API GET 请求 - 应包含“字段”参数(Swift,Facebook SDK v4.5.1)
iOS - Swift Facebook Graph 请求完成处理程序 - 表达式类型不明确,没有更多上下文
Facebook Chat Open Graph 图像代码解析