2017-02-14 133 views
0

我有我的代码问题,我已经解析出我的JSON到我得到图像的URL的级别。我正在尝试使用URL给我的图像在集合视图单元格中填充图像视图。这是我的代码。解析JSON并提取图像的URL

import UIKit 

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource { 

    var media = NSDictionary() 

    @IBAction func SearchBTN(_ sender: AnyObject) { 
     getPictures() 

    } 
    @IBOutlet weak var CollectionView: UICollectionView! 
    @IBOutlet weak var searchBoxTF: UITextField! 



    func getPictures(){ 
     let url = URL(string: "http://www.flickr.com/services/feeds/photos_public.gne?tags=baseball&format=json&nojsoncallback=1") 
     let session = URLSession(configuration: URLSessionConfiguration.default) 
     let task = URLSession.shared.dataTask(with: url!){(data, response, error) in 
      if error != nil 
      { 
       print("Error") 
      } 
      else 
      { 
       if let content = data 
       { 
        do 
        { 
         let myJSON = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as? AnyObject 
        //print(myJSON) 
         if let images = myJSON?["items"] as? [[String: AnyObject]] 
         { 
          var media = UIImage() 
          for media in images 
          { 
           // let media = self.media 
           print(media["media"]) 

          } 


         } 
        } 

        catch 
        { 

        } 
       } 
      } 
     } 
     task.resume() 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     CollectionView.delegate = self 
     CollectionView.dataSource = self 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

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


    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return media.count 
    } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCell", for: indexPath) as! ImageCollectionViewCell 
     cell.imageView.image = media[indexPath.item]as? UIImage 
     return cell 
    } 

} 
+0

JSON是不是一个图像。 cell.imageView.image = media [indexPath.item] as? UIImage,你正试图设置一个JSON值到UIImage? – 2017-02-14 00:25:01

+0

JSON结果包含我尝试获取的jpeg图像的URL,我的代码将解析JSON以获取该URL。我无法提取网址,因此我可以使用它来填充包含UIimageView的collectionViewcell,以便我可以查看图像。你有什么建议吗? – Ingelbert

+0

检查我的答案我已更新所有你需要知道的。 – 2017-02-14 00:42:59

回答

1

您的JSON响应不是图像。

cell.imageView.image = media[indexPath.item]as? UIImage,您正尝试将JSON值设置为UIImage。

http://www.flickr.com/services/feeds/photos_public.gne?tags=baseball&format=json&nojsoncallback=1 

此URL返回与URL's实际图像 JSON的响应。

然后您需要download the UIImage那些实际图片网址

编辑:(基于评论你的问题)

1:你得到NSDictionary输入反应JSON。

2:里面的NSDictionary你得到一个NSArray与 “项目”,(objectForKey: “项目”)

3:内部的NSArray你必须为每个图像对象,这是一个NSDictionary一个对象。

4:最后,在每个图像对象NSDictionary中都有一个名为“media”(objectForKey:“media”)的url,它是图像的最终URL。然后你需要下载基于该URL的UIImage

我不在Swift中编码,所以我不想给你错误的代码示例There are many threads如何从JSON响应中获取URL或任何值。

+0

你的意思是什么其他线程?你将如何收集这些URL,以便你可以下载它们。我正在阅读链接中的一些内容,我不明白链接解释的过程。 – Ingelbert

+0

你应该阅读我写的关于响应的内容。首先你得到'NSDictionary' JSON Respone。在'NSDictionary'里面你得到一个“NSArray”的“items”。在'NSArray'里面,每个图像都有一个对象,它是一个'NSDictionary'。最后,在每个图像对象'NSDictionary'中都有一个“url”'objectForKey'“媒体”,它是您图像的最终'URL'。然后你需要下载基于该URL的'UIImage'。 – 2017-02-14 00:54:54

0

试试这个代码,你会得到你预期的输出

import UIKit 

private let reuseIdentifier = "Cell" 

class MCollectionViewController: UICollectionViewController { 

    var arraImage: [String] = [String]() 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Uncomment the following line to preserve selection between presentations 
     // self.clearsSelectionOnViewWillAppear = false 

     self.collectionView!.backgroundColor = UIColor.whiteColor() 
     RestAPIManager.sharedInstance.getServerData { (Json) -> Void in 
      //print("Response = \(Json)") 
      let array = Json["items"].arrayValue 
      for item in array { 
       print("\(item["media"]["m"])") 
       self.arraImage.append(item["media"]["m"].stringValue) 
       dispatch_async(dispatch_get_main_queue(), {() -> Void in 
        self.collectionView!.reloadData() 
       }) 
      } 
     } 
    } 


    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     // Get the new view controller using [segue destinationViewController]. 
     // Pass the selected object to the new view controller. 
    } 
    */ 

    // MARK: UICollectionViewDataSource 

    override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return 1 
    } 


    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of items 
     return arraImage.count 
    } 

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 

     let padding = 10 
     let collectionViewSize = collectionView.frame.size.width - CGFloat(padding) 

     return CGSizeMake(collectionViewSize/2, collectionViewSize/2) 

    } 
    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

     let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! CollectionViewCell 

     if let url: NSURL = NSURL(string: arraImage[indexPath.row]) { 
      cell.imageView.sd_setImageWithURL(url) 
     } 
     return cell 
    } 

    // MARK: UICollectionViewDelegate 

    /* 
    // Uncomment this method to specify if the specified item should be highlighted during tracking 
    override func collectionView(collectionView: UICollectionView, shouldHighlightItemAtIndexPath indexPath: NSIndexPath) -> Bool { 
     return true 
    } 
    */ 

    /* 
    // Uncomment this method to specify if the specified item should be selected 
    override func collectionView(collectionView: UICollectionView, shouldSelectItemAtIndexPath indexPath: NSIndexPath) -> Bool { 
     return true 
    } 
    */ 

    /* 
    // Uncomment these methods to specify if an action menu should be displayed for the specified item, and react to actions performed on the item 
    override func collectionView(collectionView: UICollectionView, shouldShowMenuForItemAtIndexPath indexPath: NSIndexPath) -> Bool { 
     return false 
    } 

    override func collectionView(collectionView: UICollectionView, canPerformAction action: Selector, forItemAtIndexPath indexPath: NSIndexPath, withSender sender: AnyObject?) -> Bool { 
     return false 
    } 

    override func collectionView(collectionView: UICollectionView, performAction action: Selector, forItemAtIndexPath indexPath: NSIndexPath, withSender sender: AnyObject?) { 

    } 
    */ 

} 

我还附上了链接,你会发现项目here

+0

您应该提及代码至少需要两个第三方库 – vadian

+0

@vadian是所有库文件都在我附加的项目中链接检查出来 –