Php Swift 3-从mySQL数据库中提取图像

Php Swift 3-从mySQL数据库中提取图像,php,ios,mysql,json,swift,Php,Ios,Mysql,Json,Swift,我目前正在设计一个包含新闻提要的应用程序。图像和文本存储在我们的数据库中,但我在提取和显示图像时遇到问题。我的代码应该可以工作,但我得到了一个致命的错误,说“线程1:EXC_BAD_指令” 编译器将显示以下消息:“致命错误:在展开可选值时意外发现nil” 我在这段代码中发现了错误: if!path!.isEmpty { let url = URL(string: path!)! let imageData = try? Data(contentsOf: url) let

我目前正在设计一个包含新闻提要的应用程序。图像和文本存储在我们的数据库中,但我在提取和显示图像时遇到问题。我的代码应该可以工作,但我得到了一个致命的错误,说“线程1:EXC_BAD_指令”

编译器将显示以下消息:“致命错误:在展开可选值时意外发现nil”

我在这段代码中发现了错误:

if!path!.isEmpty {
    let url = URL(string: path!)!
    let imageData = try? Data(contentsOf: url)
    let image = UIImage(data: imageData!)!
    self.images.append(image)
} else {
    let image = UIImage()
    self.images.append(image)
}
由于对编程非常陌生,我已经在这方面停留了很长一段时间。如果你有什么建议,请告诉我!谢谢

另外,我试图检索的照片是一张.jpg,不确定这是否重要

(如果需要,下面是代码的其余部分)

导入UIKit
类SecondViewController:UIViewController、UITableViewDataSource、UITableViewDelegate{
var活动=[AnyObject]()
var images=[UIImage]()
@IBVAR表格视图:UITableView!
重写func viewDidLoad(){
super.viewDidLoad()
//tableView.contentInset=UIEdgeInsetsMake(2,0,0,0)
}
func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{
返回活动。计数
}
func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
让cell=tableView.dequeueReusableCell(标识符为:“activity”,for:indexPath)作为!CustomCell
让post=activities[indexPath.row]
让image=images[indexPath.row]
让username=post[“username”]作为字符串
让text=post[“text”]作为字符串
cell.titleLbl.text=文本
cell.userLbl.text=用户名
cell.activityImage.image!=图像
//cell.dateLbl.text=活动[indexath.row]
//cell.activityImage.image=images[indexPath.row]
返回单元
}
覆盖函数视图将出现(uo动画:Bool){
加载活动()
}
func loadActivities(){
让id=user![“id”]作为!字符串
让url=url(字符串:https://cgi.soic.indiana.edu/~team7/posts.php“!
var-request=URLRequest(url:url)
request.httpMethod=“POST”
let body=“id=\(id)&text=&uuid=”
request.httpBody=body.data(使用:String.Encoding.utf8)
URLSession.shared.dataTask(with:request){data,response,中的错误
DispatchQueue.main.async(执行:{
如果错误==nil{
做{
让json=try JSONSerialization.jsonObject(使用:data!,选项:.mutableContainers)作为?NSDictionary
//清理
self.activities.removeAll(保留容量:false)
self.images.removeAll(保留容量:false)
self.tableView.reloadData()
guard let parseJSON=json else{
打印(“解析时出错”)
返回
}
guard let posts=parseJSON[“posts”]作为?[AnyObject]其他{
打印(“解析时出错”)
返回
}
self.activities=posts
对于0中的i..
你为什么要这么做?从服务器获取图像的URL,然后使用SDWebImage在CellForRowatineXpath中异步加载它们。这是一个图书馆,你可以在这里找到。这样,您就不需要将图像存储在阵列中,而且加载速度更快


或者,您也可以实现自己的图像异步加载。

您可以尝试以下方法以避免运行时错误:

if let actualPath = path, !actualPath.isEmpty, let url = URL(string: actualPath) {
    if let imageData = try? Data(contentsOf: url) {
        if let image = UIImage(data: imageData) {
            self.images.append(image)
        }
    }
}
而不是这个

if!path!.isEmpty {
    let url = URL(string: path!)!
    let imageData = try? Data(contentsOf: url)
    let image = UIImage(data: imageData!)!
    self.images.append(image)
}

不要用!强制展开!。使用if-let构造展开选项。例如,“如果让actualObject=optionalProperty{…}”路径或imagedata为零,并且您正在强制展开它,因此出现错误我以前尝试过此方法,但由于缺乏一般编程知识,我不确定是否正确。如果让imageData=image{let imageData=try?Data(contentsOf:url)让image=UIImage(Data:imageData!)!}会是这样吗?请看我的答案并尝试一下,这是我的capstone项目,我们必须使用mySQL数据库和php来检索它。不过谢谢你的帮助,我很感激。是的,这是使用mySQL和PHPOh的方式,老实说,就像我说的,我对编程非常陌生,所有这些对我来说都没有太大意义。你加载图像的方式是一个接一个。这需要太多的时间。如果你改变了这一点,你就不需要使用数据了。一切都会好起来的,我去看看。非常感谢你!
if let actualPath = path, !actualPath.isEmpty, let url = URL(string: actualPath) {
    if let imageData = try? Data(contentsOf: url) {
        if let image = UIImage(data: imageData) {
            self.images.append(image)
        }
    }
}
if!path!.isEmpty {
    let url = URL(string: path!)!
    let imageData = try? Data(contentsOf: url)
    let image = UIImage(data: imageData!)!
    self.images.append(image)
}