2017-04-02 62 views
2

我目前正在设计具有新闻源的应用程序。图像和文本存储在我们的数据库中,但我无法拉取图像并显示它。我的代码应该工作,但我得到一个致命的错误说“线程1:EXC_BAD_INSTRUCTION”绕Swift 3 - 从mySQL数据库中提取图像

let imageData = try? Data(contentsOf: url) 
let image = UIImage(data: imageData!)! 

,编译器会显示这个消息 - “致命错误:意外发现零而展开的可选值”。

我得到的错误在此代码片段:

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,不知道这可能是重要的。

(这里是代码的其余部分如果需要的话)

import UIKit 

class SecondViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

var activities = [AnyObject]() 
var images = [UIImage]() 

@IBOutlet var tableView: UITableView! 


override func viewDidLoad() { 
    super.viewDidLoad() 

    //tableView.contentInset = UIEdgeInsetsMake(2, 0, 0, 0) 


} 


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return activities.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "activity", for: indexPath) as! CustomCell 

    let post = activities[indexPath.row] 
    let image = images[indexPath.row] 
    let username = post["username"] as? String 
    let text = post["text"] as? String 

    cell.titleLbl.text = text 
    cell.userLbl.text = username 
    cell.activityImage.image! = image 
    //cell.dateLbl.text = activities[indexPath.row] 
    //cell.activityImage.image = images[indexPath.row] 


    return cell 
} 

override func viewWillAppear(_ animated: Bool) { 
    loadActivities() 
} 


func loadActivities() { 
    let id = user!["id"] as! String 
    let url = URL(string: "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(using: String.Encoding.utf8) 

    URLSession.shared.dataTask(with: request) { data, response, error in 
     DispatchQueue.main.async(execute: { 

      if error == nil { 

       do { 

        let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary 

        // clean up 
        self.activities.removeAll(keepingCapacity: false) 
        self.images.removeAll(keepingCapacity: false) 
        self.tableView.reloadData() 

        guard let parseJSON = json else { 
         print("Error while parsing") 
         return 
        } 

        guard let posts = parseJSON["posts"] as? [AnyObject] else { 
         print("Error while parseJSONing") 
         return 
        } 


        self.activities = posts 

        for i in 0 ..< self.activities.count { 

         let path = self.activities[i]["path"] as? String 

         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) 
         } 

        } 



        self.tableView.reloadData() 


       } catch { 
       } 

      } else { 
      } 

     }) 

     }.resume() 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


} 

extension NSMutableData { 

func appendString(_ string : String) { 

    let data = string.data(using: String.Encoding.utf8, allowLossyConversion: true) 
    append(data!) 

} 

} 
+0

不要强行拆开包装用!如果让构造解开可选项,可以使用。例如。 'if let actualObject = optionalProperty {...}' – KaraBenNemsi

+0

路径或图像数据为零,并且您正在强制展开它,因此出现错误 – KaraBenNemsi

+0

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ OptionalChaining.html – KaraBenNemsi

回答

-1

你为什么做这一切的?从服务器获取图像的URL,然后使用SDWebImage在cellForRowAtIndexPath中异步加载它们。这是一个图书馆,你可以在这里找到它。 https://github.com/rs/SDWebImage。这样您就不需要将图像存储在数组中,加载速度会更快。

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

+0

这是我的顶点项目,我们必须使用MySQL数据库和PHP来检索它。感谢您的帮助,但我很感激。 – jmoney11944

+0

是的,这是使用mySQL和PHP做的方式 –

+0

哦,说实话,就像我说的,我对编程非常陌生,所有这些对我来说都没有多大意义。 – jmoney11944

0

你可以尝试这样的事情来避免运行时错误:

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) 
}