UICollectionView 中的 Alamofire + Swift

Posted

技术标签:

【中文标题】UICollectionView 中的 Alamofire + Swift【英文标题】:Alamofire + Swift in UICollectionView 【发布时间】:2015-02-12 10:44:13 【问题描述】:

我不知道如何使用 Alamofire 解析 JSON 数据。现在我成功地从网络服务请求数据。问题是我不太确定如何将 json(图像)数据嵌入/解析到 UICollectionView

import UIKit
import Alamofire

class PopularViewController: UIViewController,UICollectionViewDataSource, UICollectionViewDelegate 

    var users: [AnyObject] = []

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        //#warning Incomplete method implementation -- Return the number of items in the section
        return users.count
    

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("UserCell", forIndexPath: indexPath) as PopularCollectionViewCell

        Alamofire.request(.GET, "http://xxxxx/users.json").responseJSON  (_, _, data, _) in
            println(data)

        
        return cell
    

    override func viewDidLoad() 
        super.viewDidLoad()

    

Json 数据


    "users": [
        "userId": 1,
        "profilePhoto": "https://graph.facebook.com/1301454197/picture?type=large"
    ]

【问题讨论】:

【参考方案1】:

我已经找到了解决办法。

PopularViewController.swift

import UIKit
import Alamofire

class PopularViewController: UIViewController,UICollectionViewDataSource, UICollectionViewDelegate 

    var users: [JSON] = []
    @IBOutlet var collectionView: UICollectionView!

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        //#warning Incomplete method implementation -- Return the number of items in the section
        return users.count
    

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("UserCell", forIndexPath: indexPath) as PopularCollectionViewCell

        cell.user = self.users[indexPath.row]
        return cell
    

    override func viewDidLoad() 
        super.viewDidLoad()

        Alamofire.request(.GET, "xxxxx/users.json").responseJSON  (request, response, json, error) in

            if json != nil 
                var jsonObj = JSON(json!)
                if let data = jsonObj["users"].arrayValue as [JSON]?
                    self.users = data
                    self.collectionView.reloadData()
                
            

        
    

PopularCollectionViewCell.swift

import UIKit
import Haneke

class PopularCollectionViewCell: UICollectionViewCell 

    @IBOutlet weak var profilePicture:UIImageView!

    var user:JSON?
        didSet
            self.setupUser()
        
    

    func setupUser()

        if let urlString = self.user?["profilePhoto"]
            let url = NSURL(string: urlString.stringValue)
            self.profilePicture.hnk_setImageFromURL(url!)
        

    

【讨论】:

【参考方案2】:

首先,我假设您的 UICollectionView 中有一些 UIImageView ,否则您将首先需要它。

一旦你解析了 json 数据并有了图片的 url,你需要使用另一个库来下载实际的图片。我发现 SDWebImageDownloader (https://github.com/rs/SDWebImage) 对这项任务很有用。该库位于目标 C 中,因此您必须使用桥接头。

var url: NSURL = NSURL(string: self.detailsData.ownerImage)!
SDWebImageDownloader.sharedDownloader().downloadImageWithURL(url, options: nil, progress: nil, completed: (image: UIImage?, data: NSData?, error: NSError?, finished: Bool) in
    if (image != nil) 
        //Do something with your image. This is now UIImage
    
)

另一个是 (https://github.com/Haneke/HanekeSwift)。我没有亲自使用它,但看起来这就是你所做的。但是,这个很快,所以你可能更容易先尝试这个。从文档来看,它们似乎扩展了 UIImageView,因此您应该可以使用这些方法。

// Setting a remote image
imageView.hnk_setImageFromURL(url)

// Setting an image manually. Requires you to provide a key.
imageView.hnk_setImage(image, key: key)

我希望这会有所帮助。

【讨论】:

【参考方案3】:

@Dato' Mohammed Nurdin 如果您使用 Swiftyjson,这将起作用,如果您想下载图像,我建议您在 Alamofire 框架中扩展 Request 并构建自己的 responseImage 函数,如下所示:

extension Alamofire.Request 
class func imageResponseSerializer() -> Serializer 
        return  request, response, data in
            if data == nil 
                return (nil, nil)
            

            let image = UIImage(data: data!, scale: UIScreen.mainScreen().scale)
            return (image, nil)
        
    


    func responseImage(completionHandler: (NSURLRequest, NSHTTPURLResponse?, UIImage?, NSError?) -> Void) -> Self 
        return response(serializer: Request.imageResponseSerializer(), completionHandler:  (request, response, image, error) in
            completionHandler(request, response, image as? UIImage, error)
        )
    

【讨论】:

以上是关于UICollectionView 中的 Alamofire + Swift的主要内容,如果未能解决你的问题,请参考以下文章

UITableviewCell 中的 UICollectionView。添加约束后,UICollectionView 不显示

UICollectionView 中的 UILabel 重载

UICollectionView 中的垂直和水平滚动方向

UITableViewCell 中的 UICollectionView

如何更改 UICollectionView 中的滚动方向?

UICollectionView 中的重载数据