I'm totally new for iOS swift deveploment. I'm trying to do json image parsing with dynamic data/url, I tried without a result to search for examples for displaying data and images in table view or list view, can any one help me in achieving this task?
我完全不喜欢iOS的swift代码。我正在尝试用动态数据/url进行json图像解析,我尝试了没有搜索结果来搜索表格视图或列表视图中的数据和图像,谁能帮助我完成这个任务?
Here is the following link for image parsing
下面是用于图像解析的链接
http://www.androidbegin.com/tutorial/jsonparsetutorial.txt
http://www.androidbegin.com/tutorial/jsonparsetutorial.txt
3 个解决方案
#1
1
As a newbie i think this Library will ease your most of the work,
作为一个新手,我认为这个图书馆将使你的大部分工作变得轻松,
- SwiftyJSON
- SwiftyJSON
the syntax is very dev friendly and simple , No struggling of if let
syntax and nesting.Example usage create json with one simple line let json = JSON(data : data)
and many more with custom data types.Have a look of this Lib
语法非常适合开发,而且很简单,如果让语法和嵌套就没有问题了。示例用法使用一个简单的行创建json,让json = json(数据:数据),更多的行使用自定义数据类型。看看这个图书馆
let rank = json["worldpopulation"][0]["rank"].int let country = json["worldpopulation"][0]["country"].string let flag = json["worldpopulation"][0]["flag"].string
让rank = json["worldpopulation"][0]["rank"].int让国家= json["世界人口"][0]["国家"]。string let flag = json["worldpopulation"][0]["flag"].string
#2
0
func countriesResponseReceived(response : NSDictionary)
{
let arrCountries = (response.object(forKey: "worldpopulation")) as! NSArray
for dict in arrCountries!
{
let dictData = dict as! NSDictionary
let rank = dictData.object(forKey: "rank") as! NSInteger
let country = dictData.object(forKey: "country") as! String
let flag = dictData.object(forKey: "flag") as! String
}
}
#3
0
Swift 3.0 create new Xcode project take one table view create tableViewCell File create NSObject Class File take one lable(Country Name) take one imageView(flag) put Below Code in Right Place(note: place is mention before starting code)
Swift 3.0创建新的Xcode项目获取一个表视图创建tableViewCell文件创建NSObject类文件获取一个lable(国家名)获取一个imageView(标志)将代码放在正确的位置(注意:在开始代码之前提到位置)
ViewController Code
ViewController代码
import UIKit
class ViewController: UIViewController , UITableViewDelegate , UITableViewDataSource {
@IBOutlet var imgTable: UITableView!
var ArrayData:[Datad] = []
override func viewDidLoad() {
super.viewDidLoad()
service()
// 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 tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return ArrayData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CellDemo") as! ImageTableViewCell
let objarr = ArrayData[indexPath.row]
cell.lblContry.text = objarr.Country
cell.imgflag.setImageFrom(imageURLString: objarr.Countryflag, completionHandler: { (complete, image, error) in
})
return cell
}
func service()
{
let url = URL(string: "http://www.androidbegin.com/tutorial/jsonparsetutorial.txt")
var urlRequest = URLRequest(url: url!, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 60)
urlRequest.httpMethod = "GET"
let session = URLSession.shared
let task = session.dataTask(with: urlRequest) { (data, response, errorresponce) in
if errorresponce != nil
{
print(errorresponce?.localizedDescription ?? "Value Not Found")
}
else
{
do
{
if let dictionary = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
{
DispatchQueue.main.async {
for datacon in (dictionary.value(forKey: "worldpopulation") as! NSArray) {
let cellonr = Datad(dictionary: datacon as! NSDictionary )
self.ArrayData.append(cellonr)
self.imgTable.reloadData()
}
}
}
else
{
print("value not found")
}
}
catch let error as Error!
{
print(error.localizedDescription)
}
}
}
task.resume()
}
}
TableView Cell Code
表视图单元代码
import UIKit
class ImageTableViewCell: UITableViewCell {
@IBOutlet var lblContry: UILabel!
@IBOutlet var imgflag: UIImageView!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
NSObject File
NSObject文件
import UIKit
class Datad: NSObject {
var Country:String!
var Countryflag:String!
init(dictionary:NSDictionary)
{
Country = (dictionary.value(forKey: "country") as! String)
Countryflag = (dictionary.value(forKey: "flag") as! String)
}
}
copy this two file (Note below 2 File Name Not Change Strikly Follow ) first
复制这两个文件(注意下面的两个文件名不改变明显跟随)
ImageDownloadManager.swift
ImageDownloadManager.swift
import Foundation
import UIKit
typealias DownloadHandler = (_ success: Bool, _ image: UIImage?, _ error: Error?) -> Void
typealias DownloadProgressHandler = (_ totalBytesExpected : Int64, _ bytesDownloaded: Int64, _ error : Error?) -> Void
private var kImageURLKey : String = "imageURLKey"
extension UIImageView{
var imageURLId : String{
get{
return objc_getAssociatedObject(self, &kImageURLKey) as! String
}
set(newValue){
objc_setAssociatedObject(self, &kImageURLKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
func setImageFrom(imageURLString : String,
placeHolderImage: UIImage? = nil,
completionHandler: DownloadHandler?) {
if (imageURLString.characters.count > 0){
if ((placeHolderImage) != nil){
self.image = placeHolderImage;
}
self.imageURLId = imageURLString
ImageDownloadManager.sharedManager.getImageFromURL(imageURLString: imageURLString)
{ (success : Bool, image : UIImage?, error :Error?) in
if (success){
self.isUserInteractionEnabled = true
self.updateImage(image: image!, imageUrl: imageURLString)
}
if ((completionHandler) != nil){
completionHandler!(success, image, error)
}
}
}
}
func setImageFrom(imageURLString : String,
placeHolderImage: UIImage? = nil,
progressHandler: @escaping DownloadProgressHandler,
completionHandler: DownloadHandler?) {
if (imageURLString.characters.count > 0){
if ((placeHolderImage) != nil){
self.image = placeHolderImage;
}
self.imageURLId = imageURLString
ImageDownloadManager.sharedManager.getImageFromURL(imageURLString: imageURLString,
progessHandler: { (expectedBytes:Int64, downloadedBytes:Int64, error:Error?) in
if error != nil {
completionHandler!(false, nil, error)
}else{
progressHandler(expectedBytes, downloadedBytes, nil)
}
},
completionHandler: { (success:Bool, image:UIImage?, error:Error?) in
if (success){
self.updateImage(image: image!, imageUrl: imageURLString)
}
if ((completionHandler) != nil){
completionHandler!(success, image, error)
}
})
}
}
private func updateImage(image:UIImage, imageUrl:String) {
if (imageUrl == imageURLId)
{
UIView.transition(with: self,
duration: 0.4,
options: .transitionCrossDissolve,
animations: {
self.image = image;
},
completion: nil)
}
}
}
UIImageView+AsyncLoad.swift
UIImageView + AsyncLoad.swift
import UIKit
struct ImageDownloadInfo {
let downloadURLString : String
let downloadTask : URLSessionTask
let progressHandler : DownloadProgressHandler?
let completionHandler : DownloadHandler?
}
class ImageDownloadManager: NSObject {
static let sharedManager : ImageDownloadManager = ImageDownloadManager()
var imageLoaderQueue : [String:ImageDownloadInfo] = [:]
var imageCache : NSCache<NSString, UIImage> = NSCache()
lazy var downloadsSession : URLSession = URLSession(configuration: URLSessionConfiguration.default)
lazy var downloadDelegateSession : URLSession = URLSession(configuration: URLSessionConfiguration.default, delegate: sharedManager, delegateQueue: OperationQueue.main)
func getImageFromURL(imageURLString:String,
completionHandler:@escaping DownloadHandler) {
let cachedImage : UIImage? = imageCache.object(forKey: imageURLString as NSString)
if cachedImage != nil {
completionHandler(true, cachedImage, nil)
}else {
downloadImageFor(imageURLString: imageURLString, downloadHandler: completionHandler)
}
}
func getImageFromURL(imageURLString:String,
progessHandler: @escaping DownloadProgressHandler,
completionHandler: @escaping DownloadHandler ){
let cachedImage : UIImage? = imageCache.object(forKey: imageURLString as NSString)
if cachedImage != nil {
progessHandler(1, 1, nil)
completionHandler(true, cachedImage, nil)
}else {
downloadImageFor(imageURLString: imageURLString, progressHandler: progessHandler, completionHandler:completionHandler)
}
}
private func downloadImageFor(imageURLString:String,
downloadHandler: @escaping DownloadHandler) {
var imageDownloadInfo: ImageDownloadInfo? = imageLoaderQueue[imageURLString]
if imageDownloadInfo == nil {
let imageLoaderTask = downloadsSession.dataTask(with: URL(string: imageURLString)!, completionHandler: { (data : Data?, response : URLResponse?, error : Error?) in
OperationQueue.main.addOperation({
if (error != nil){
downloadHandler(false, nil, error)
}
else{
let image = UIImage(data: data!)
if image != nil {
ImageDownloadManager.sharedManager.imageCache.setObject(image!, forKey: imageURLString as NSString)
downloadHandler(true, image, nil)
}
else {
downloadHandler(false, nil, error)
}
}
ImageDownloadManager.sharedManager.imageLoaderQueue[imageURLString] = nil
})
})
imageDownloadInfo = ImageDownloadInfo(downloadURLString: imageURLString,
downloadTask: imageLoaderTask,
progressHandler: nil,
completionHandler:nil)
imageLoaderQueue[imageURLString] = imageDownloadInfo
imageDownloadInfo?.downloadTask.resume()
}
}
private func downloadImageFor(imageURLString:String,
progressHandler: @escaping DownloadProgressHandler,
completionHandler: @escaping DownloadHandler) {
var imageDownloadInfo: ImageDownloadInfo? = imageLoaderQueue[imageURLString]
if imageDownloadInfo == nil {
let imageLoaderTask = downloadDelegateSession.downloadTask(with: URL(string: imageURLString)!)
imageDownloadInfo = ImageDownloadInfo(downloadURLString: imageURLString,
downloadTask: imageLoaderTask,
progressHandler: progressHandler,
completionHandler:completionHandler)
imageLoaderQueue[imageURLString] = imageDownloadInfo
imageDownloadInfo?.downloadTask.resume()
}
}
}
extension ImageDownloadManager : URLSessionDownloadDelegate {
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL){
let imageUrl : String = (downloadTask.originalRequest?.url?.absoluteString)!
let imageDownloadInfo: ImageDownloadInfo? = imageLoaderQueue[imageUrl]
if imageDownloadInfo != nil {
do {
let data = try Data(contentsOf: location)
let image = UIImage(data: data)
ImageDownloadManager.sharedManager.imageCache.setObject(image!, forKey: imageUrl as NSString)
if let completionHandler = imageDownloadInfo?.completionHandler {
completionHandler(true, image, nil)
}
} catch {
print(error.localizedDescription)
}
}
}
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64){
let imageUrl = downloadTask.originalRequest?.url?.absoluteString
let imageDownloadInfo: ImageDownloadInfo? = imageLoaderQueue[imageUrl!]
if imageDownloadInfo != nil {
if let progressHandler = imageDownloadInfo?.progressHandler {
progressHandler(totalBytesExpectedToWrite, totalBytesWritten, nil)
}
}
}
}
#1
1
As a newbie i think this Library will ease your most of the work,
作为一个新手,我认为这个图书馆将使你的大部分工作变得轻松,
- SwiftyJSON
- SwiftyJSON
the syntax is very dev friendly and simple , No struggling of if let
syntax and nesting.Example usage create json with one simple line let json = JSON(data : data)
and many more with custom data types.Have a look of this Lib
语法非常适合开发,而且很简单,如果让语法和嵌套就没有问题了。示例用法使用一个简单的行创建json,让json = json(数据:数据),更多的行使用自定义数据类型。看看这个图书馆
let rank = json["worldpopulation"][0]["rank"].int let country = json["worldpopulation"][0]["country"].string let flag = json["worldpopulation"][0]["flag"].string
让rank = json["worldpopulation"][0]["rank"].int让国家= json["世界人口"][0]["国家"]。string let flag = json["worldpopulation"][0]["flag"].string
#2
0
func countriesResponseReceived(response : NSDictionary)
{
let arrCountries = (response.object(forKey: "worldpopulation")) as! NSArray
for dict in arrCountries!
{
let dictData = dict as! NSDictionary
let rank = dictData.object(forKey: "rank") as! NSInteger
let country = dictData.object(forKey: "country") as! String
let flag = dictData.object(forKey: "flag") as! String
}
}
#3
0
Swift 3.0 create new Xcode project take one table view create tableViewCell File create NSObject Class File take one lable(Country Name) take one imageView(flag) put Below Code in Right Place(note: place is mention before starting code)
Swift 3.0创建新的Xcode项目获取一个表视图创建tableViewCell文件创建NSObject类文件获取一个lable(国家名)获取一个imageView(标志)将代码放在正确的位置(注意:在开始代码之前提到位置)
ViewController Code
ViewController代码
import UIKit
class ViewController: UIViewController , UITableViewDelegate , UITableViewDataSource {
@IBOutlet var imgTable: UITableView!
var ArrayData:[Datad] = []
override func viewDidLoad() {
super.viewDidLoad()
service()
// 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 tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return ArrayData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CellDemo") as! ImageTableViewCell
let objarr = ArrayData[indexPath.row]
cell.lblContry.text = objarr.Country
cell.imgflag.setImageFrom(imageURLString: objarr.Countryflag, completionHandler: { (complete, image, error) in
})
return cell
}
func service()
{
let url = URL(string: "http://www.androidbegin.com/tutorial/jsonparsetutorial.txt")
var urlRequest = URLRequest(url: url!, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 60)
urlRequest.httpMethod = "GET"
let session = URLSession.shared
let task = session.dataTask(with: urlRequest) { (data, response, errorresponce) in
if errorresponce != nil
{
print(errorresponce?.localizedDescription ?? "Value Not Found")
}
else
{
do
{
if let dictionary = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
{
DispatchQueue.main.async {
for datacon in (dictionary.value(forKey: "worldpopulation") as! NSArray) {
let cellonr = Datad(dictionary: datacon as! NSDictionary )
self.ArrayData.append(cellonr)
self.imgTable.reloadData()
}
}
}
else
{
print("value not found")
}
}
catch let error as Error!
{
print(error.localizedDescription)
}
}
}
task.resume()
}
}
TableView Cell Code
表视图单元代码
import UIKit
class ImageTableViewCell: UITableViewCell {
@IBOutlet var lblContry: UILabel!
@IBOutlet var imgflag: UIImageView!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
NSObject File
NSObject文件
import UIKit
class Datad: NSObject {
var Country:String!
var Countryflag:String!
init(dictionary:NSDictionary)
{
Country = (dictionary.value(forKey: "country") as! String)
Countryflag = (dictionary.value(forKey: "flag") as! String)
}
}
copy this two file (Note below 2 File Name Not Change Strikly Follow ) first
复制这两个文件(注意下面的两个文件名不改变明显跟随)
ImageDownloadManager.swift
ImageDownloadManager.swift
import Foundation
import UIKit
typealias DownloadHandler = (_ success: Bool, _ image: UIImage?, _ error: Error?) -> Void
typealias DownloadProgressHandler = (_ totalBytesExpected : Int64, _ bytesDownloaded: Int64, _ error : Error?) -> Void
private var kImageURLKey : String = "imageURLKey"
extension UIImageView{
var imageURLId : String{
get{
return objc_getAssociatedObject(self, &kImageURLKey) as! String
}
set(newValue){
objc_setAssociatedObject(self, &kImageURLKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
func setImageFrom(imageURLString : String,
placeHolderImage: UIImage? = nil,
completionHandler: DownloadHandler?) {
if (imageURLString.characters.count > 0){
if ((placeHolderImage) != nil){
self.image = placeHolderImage;
}
self.imageURLId = imageURLString
ImageDownloadManager.sharedManager.getImageFromURL(imageURLString: imageURLString)
{ (success : Bool, image : UIImage?, error :Error?) in
if (success){
self.isUserInteractionEnabled = true
self.updateImage(image: image!, imageUrl: imageURLString)
}
if ((completionHandler) != nil){
completionHandler!(success, image, error)
}
}
}
}
func setImageFrom(imageURLString : String,
placeHolderImage: UIImage? = nil,
progressHandler: @escaping DownloadProgressHandler,
completionHandler: DownloadHandler?) {
if (imageURLString.characters.count > 0){
if ((placeHolderImage) != nil){
self.image = placeHolderImage;
}
self.imageURLId = imageURLString
ImageDownloadManager.sharedManager.getImageFromURL(imageURLString: imageURLString,
progessHandler: { (expectedBytes:Int64, downloadedBytes:Int64, error:Error?) in
if error != nil {
completionHandler!(false, nil, error)
}else{
progressHandler(expectedBytes, downloadedBytes, nil)
}
},
completionHandler: { (success:Bool, image:UIImage?, error:Error?) in
if (success){
self.updateImage(image: image!, imageUrl: imageURLString)
}
if ((completionHandler) != nil){
completionHandler!(success, image, error)
}
})
}
}
private func updateImage(image:UIImage, imageUrl:String) {
if (imageUrl == imageURLId)
{
UIView.transition(with: self,
duration: 0.4,
options: .transitionCrossDissolve,
animations: {
self.image = image;
},
completion: nil)
}
}
}
UIImageView+AsyncLoad.swift
UIImageView + AsyncLoad.swift
import UIKit
struct ImageDownloadInfo {
let downloadURLString : String
let downloadTask : URLSessionTask
let progressHandler : DownloadProgressHandler?
let completionHandler : DownloadHandler?
}
class ImageDownloadManager: NSObject {
static let sharedManager : ImageDownloadManager = ImageDownloadManager()
var imageLoaderQueue : [String:ImageDownloadInfo] = [:]
var imageCache : NSCache<NSString, UIImage> = NSCache()
lazy var downloadsSession : URLSession = URLSession(configuration: URLSessionConfiguration.default)
lazy var downloadDelegateSession : URLSession = URLSession(configuration: URLSessionConfiguration.default, delegate: sharedManager, delegateQueue: OperationQueue.main)
func getImageFromURL(imageURLString:String,
completionHandler:@escaping DownloadHandler) {
let cachedImage : UIImage? = imageCache.object(forKey: imageURLString as NSString)
if cachedImage != nil {
completionHandler(true, cachedImage, nil)
}else {
downloadImageFor(imageURLString: imageURLString, downloadHandler: completionHandler)
}
}
func getImageFromURL(imageURLString:String,
progessHandler: @escaping DownloadProgressHandler,
completionHandler: @escaping DownloadHandler ){
let cachedImage : UIImage? = imageCache.object(forKey: imageURLString as NSString)
if cachedImage != nil {
progessHandler(1, 1, nil)
completionHandler(true, cachedImage, nil)
}else {
downloadImageFor(imageURLString: imageURLString, progressHandler: progessHandler, completionHandler:completionHandler)
}
}
private func downloadImageFor(imageURLString:String,
downloadHandler: @escaping DownloadHandler) {
var imageDownloadInfo: ImageDownloadInfo? = imageLoaderQueue[imageURLString]
if imageDownloadInfo == nil {
let imageLoaderTask = downloadsSession.dataTask(with: URL(string: imageURLString)!, completionHandler: { (data : Data?, response : URLResponse?, error : Error?) in
OperationQueue.main.addOperation({
if (error != nil){
downloadHandler(false, nil, error)
}
else{
let image = UIImage(data: data!)
if image != nil {
ImageDownloadManager.sharedManager.imageCache.setObject(image!, forKey: imageURLString as NSString)
downloadHandler(true, image, nil)
}
else {
downloadHandler(false, nil, error)
}
}
ImageDownloadManager.sharedManager.imageLoaderQueue[imageURLString] = nil
})
})
imageDownloadInfo = ImageDownloadInfo(downloadURLString: imageURLString,
downloadTask: imageLoaderTask,
progressHandler: nil,
completionHandler:nil)
imageLoaderQueue[imageURLString] = imageDownloadInfo
imageDownloadInfo?.downloadTask.resume()
}
}
private func downloadImageFor(imageURLString:String,
progressHandler: @escaping DownloadProgressHandler,
completionHandler: @escaping DownloadHandler) {
var imageDownloadInfo: ImageDownloadInfo? = imageLoaderQueue[imageURLString]
if imageDownloadInfo == nil {
let imageLoaderTask = downloadDelegateSession.downloadTask(with: URL(string: imageURLString)!)
imageDownloadInfo = ImageDownloadInfo(downloadURLString: imageURLString,
downloadTask: imageLoaderTask,
progressHandler: progressHandler,
completionHandler:completionHandler)
imageLoaderQueue[imageURLString] = imageDownloadInfo
imageDownloadInfo?.downloadTask.resume()
}
}
}
extension ImageDownloadManager : URLSessionDownloadDelegate {
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL){
let imageUrl : String = (downloadTask.originalRequest?.url?.absoluteString)!
let imageDownloadInfo: ImageDownloadInfo? = imageLoaderQueue[imageUrl]
if imageDownloadInfo != nil {
do {
let data = try Data(contentsOf: location)
let image = UIImage(data: data)
ImageDownloadManager.sharedManager.imageCache.setObject(image!, forKey: imageUrl as NSString)
if let completionHandler = imageDownloadInfo?.completionHandler {
completionHandler(true, image, nil)
}
} catch {
print(error.localizedDescription)
}
}
}
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64){
let imageUrl = downloadTask.originalRequest?.url?.absoluteString
let imageDownloadInfo: ImageDownloadInfo? = imageLoaderQueue[imageUrl!]
if imageDownloadInfo != nil {
if let progressHandler = imageDownloadInfo?.progressHandler {
progressHandler(totalBytesExpectedToWrite, totalBytesWritten, nil)
}
}
}
}