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 重载