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 图像代码解析

使用 Facebook Graph Api 在 iphone 中解析新闻提要响应

解析 JSON Facebook 对话 XCODE

下载高分辨率个人资料图片 Facebook Graph API