在解包可选值时意外发现nil - NSMutableArray - Swift

时间:2016-03-09 20:01:24

标签: swift null protocols

我正在从数据库中检索数据处理程序中的帖子以获取新闻源,我运行一个php脚本并将JSON编码数据回送给我的应用程序,此时数据被解析并存储在“ post“,有一个协议,在视图控制器中用于在下载数据后获取数据。我的问题是,当我将“post”对象的NSMutableArray传递给作为协议功能的函数“itemsDownloaded”时,我得到了臭名昭着的“在解开可选值时意外发现nil”错误。我检查了所有被解析的值并且它们存在,我还检查了数组的计数以确保它具有值。例外情况发生在foreach($_SESSION['tupple'] as $key => $value) { $commitUpdate = $mysqli->query("UPDATE user_table set col_name='".$mysqli->real_escape_string($value['col_name'])."' where id='".$mysqli->real_escape_string($value['id'])."'"); }

处理数据的代码如下:

result = list(getAnagrams(inp))
result.sort(key=lambda x: len(x), reverse=True)
print(result[0])

在我的视图控制器中,我创建了一个新的数据处理程序self.delegate.itemsDownloaded(posts),然后一旦视图加载,我调用import Foundation protocol PostDataHandlerProtocol: class { func itemsDownloaded(items: NSArray) } class PostDataHandler: NSObject, NSURLSessionDataDelegate { weak var delegate: PostDataHandlerProtocol! var data : NSMutableData = NSMutableData() //The path to the php script to be executed let urlPath: String = "www.something.com/myphpscript.php" func downloadItems() { let url: NSURL = NSURL(string: urlPath)! var session: NSURLSession! let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil) let task = session.dataTaskWithURL(url) task.resume() } func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) { self.data.appendData(data); } func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) { if error != nil { print("Failed to download data") }else { print("Data downloaded") self.parseJSON() } } func parseJSON() { var jsonResult: NSMutableArray = NSMutableArray() do{ jsonResult = try NSJSONSerialization.JSONObjectWithData(self.data, options:NSJSONReadingOptions.AllowFragments) as! NSMutableArray } catch let error as NSError { print(error) } var jsonElement: NSDictionary = NSDictionary() let posts: NSMutableArray = NSMutableArray() for(var i = 0; i < jsonResult.count; i++) { jsonElement = jsonResult[i] as! NSDictionary let post = PostModel() //The following insures none of the JsonElement values are nil through optional binding let username = jsonElement["username"] as? String let imagePath = jsonElement["user_imagePath"] as? String let postID = (jsonElement["post_id"] as! NSString).integerValue let postRep = (jsonElement["post_rep"] as! NSString).integerValue let postType = jsonElement["post_type"] as? String let postDate = jsonElement["post_date"] as? String let comment = jsonElement["comment"] as? String post.username = username post.imagePath = imagePath post.postID = postID post.postRep = postRep post.postType = postType post.postDate = postDate post.comment = comment posts.addObject(post) } dispatch_async(dispatch_get_main_queue(), { () -> Void in self.delegate.itemsDownloaded(posts) }) } } 并在视图控制器声明中我符合协议并实现itemsDownloaded:

let postHandler = PostDataHandler()

有谁知道为什么会这样?我试着查看关于这个错误的大量帖子,因为我知道它很常见,但找不到任何帮助我的东西。许多贴子说应该检查以确保它不是零,问题是我不认为NSMutableArray可以是可选的,我也检查了所有的值,它们似乎不是零,所以这些答案没有不帮我在线程异常中它表示与闭包有关的东西,我认为这可能导致问题,我只是不确定是什么或如何。

1 个答案:

答案 0 :(得分:0)

您展示的所有代码都没有将PostDataHandler的delegate属性设置为任何内容,因此可以合理地假设它仍然是nil,这完全可以解释为什么在运行时崩溃的原因访问它就好像它是一个真实的对象。