Swift UITableView瀑布流/NSURLConnection异步网络请求

去年写过一个OC版本的瀑布流Demo【iOS】UITableView实现的瀑布流效果

接触Swift一段时间了,今天就是用Swift再写了一个瀑布流的Demo。原理是一样的这里不再赘述。在写这个Demo的过程中是用到了NSURLConnection的异步网络请求和GCD做了一个图片的异步加载,没有做图片的缓存,所以是用起来有些卡。cell是带左滑删除视图的,删除功能是没有实现的。

效果图:



Demo工作流程:

1.制作三个tableiView

2.网络请求,获取图片数据模型(title和url等)

3.数据封装成模型

4.reload tableView

图片数据模型


代码

PICModel.swift

import UIKit

class PICModel: NSObject {
    var album_id : NSNumber?
    var brand_name : String?
    var created_at : NSNumber?
    var height : NSNumber?
    var id : String?
    var new_height : NSNumber?
    var new_width : NSNumber?
    var pic_url_d : String?
    var pic_url_x : String?
    var price : String?
    var title : String?
    var width : NSNumber?
}
ViewController.swift
//
//  ViewController.swift
//  瀑布流-Swift
//
//  Created by zhuming on 16/3/29.
//  copyright © 2016年 zhuming. All rights reserved.
//

import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UIAlertViewDelegate{

    var tableView1 : UITableView?
    var tableView2 : UITableView?
    var tableView3 : UITableView?
    var indexPath : NSIndexPath?
    var menbers1 = [NSDictionary]()
    var menbers2 = [NSDictionary]()
    var menbers3 = [NSDictionary]()
    var PICModelArray1 = [PICModel]()
    var PICModelArray2 = [PICModel]()
    var PICModelArray3 = [PICModel]()
    var dataArray = ["1","2","3","4","5","6","7","8","9","10","11","12"]
    let urlString1 = "http://itugo.com/client/ios/api/getpiclist?_version=20140117.2.5.1&_req_from=oc&_source=ios&type=&_uuid=efe47094e00109db8c28cf0ae9b607b9&max=&tag=&_promotion_channel=App%20Store&_platform=iPhone&sort=new&from=tag&_uiid=2FF998CF0D2A40E7AF6F8FAFB8F57538&_net=wifi&min=0";
    let urlString2 = "http://itugo.com/client/ios/api/getpiclist?_version=20140117.2.5.1&_req_from=oc&_source=ios&type=accessary&_uuid=efe47094e00109db8c28cf0ae9b607b9&max=&tag=&_promotion_channel=App%20Store&_platform=iPhone&sort=new&from=tag&_uiid=2FF998CF0D2A40E7AF6F8FAFB8F57538&_net=wifi&min=0";
    let urlString3 = "http://itugo.com/client/ios/api/getpiclist?_version=20140117.2.5.1&_req_from=oc&_source=ios&type=shoes&_uuid=efe47094e00109db8c28cf0ae9b607b9&max=&tag=&_promotion_channel=App%20Store&_platform=iPhone&sort=new&from=tag&_uiid=2FF998CF0D2A40E7AF6F8FAFB8F57538&_net=wifi&min=0";
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.initTableView()
        
        self.requestData(urlString1)
        self.requestData(urlString2)
        self.requestData(urlString3)
        
        // Do any additional setup after loading the view,typically from a nib.
    }
    /**
        初始化表格
     */
    func initTableView() {
        self.tableView1 = UITableView.init(frame: CGRectMake(5,20,100,548))
        self.tableView1!.delegate = self
        self.tableView1!.dataSource = self;
        self.tableView1?.showsverticalScrollIndicator = false
        self.tableView1!.registerNib(UINib(nibName:"PBTableViewCell",bundle:nil),forCellReuseIdentifier:"PBTableViewCell")
        self.view .addSubview(self.tableView1!)
        
        self.tableView2 = UITableView.init(frame: CGRectMake(110,548))
        self.tableView2!.delegate = self
        self.tableView2!.dataSource = self;
        self.tableView2?.showsverticalScrollIndicator = false
        self.tableView2!.registerNib(UINib(nibName:"PBTableViewCell",forCellReuseIdentifier:"PBTableViewCell")
        self.view .addSubview(self.tableView2!)
        
        self.tableView3 = UITableView.init(frame: CGRectMake(215,548))
        self.tableView3!.delegate = self
        self.tableView3!.dataSource = self;
        self.tableView3?.showsverticalScrollIndicator = false
        self.tableView3!.registerNib(UINib(nibName:"PBTableViewCell",forCellReuseIdentifier:"PBTableViewCell")
        self.view .addSubview(self.tableView3!)
        
    }
    // 网络请求数据
    func requestData(urlString : String){
        let url = NSURL(string: urlString)
        let request = NSURLRequest(URL:  url!)
        NSURLConnection.sendAsynchronousRequest(request,queue: NSOperationQueue.mainQueue()) { (response:NSURLResponse?,data:NSData?,error:NSError?) in
            let jsonResult:NSDictionary = try! NSJSONSerialization.JSONObjectWithData(data!,options:  NSJSONReadingOptions.MutableContainers) as! NSDictionary
            let dice:NSDictionary = (jsonResult["data"] as? NSDictionary)!
            
            if (url!.isEqual(NSURL(string: self.urlString1))){
                self.menbers1 = dice["data"] as! Array
                print("self.menbers = \(self.menbers1.count)")
                
                for value in self.menbers1{
                    let dice:NSDictionary = value
                    self.PICModelArray1.append(self .makePICModel(dice))
                }
                print("PICModelArray = \(self.PICModelArray1.count)")
                self.tableView1?.reloadData()
            }
            if (url!.isEqual(NSURL(string: self.urlString2))){
                self.menbers2 = dice["data"] as! Array
                print("self.menbers = \(self.menbers2.count)")
                
                for value in self.menbers2{
                    let dice:NSDictionary = value
                    self.PICModelArray2.append(self .makePICModel(dice))
                }
                print("PICModelArray = \(self.PICModelArray2.count)")
                self.tableView2?.reloadData()
            }
            if (url!.isEqual(NSURL(string: self.urlString3))){
                self.menbers3 = dice["data"] as! Array
                print("self.menbers = \(self.menbers3.count)")
                
                for value in self.menbers3{
                    let dice:NSDictionary = value
                    self.PICModelArray3.append(self .makePICModel(dice))
                }
                print("PICModelArray = \(self.PICModelArray3.count)")
                self.tableView3?.reloadData()
            }
        }
    }
    // 数据封装成模型
    func makePICModel(dice : NSDictionary) -> PICModel{
        let model = PICModel.init()
        model.album_id = dice["album_id"] as? NSNumber
        model.brand_name = dice["brand_name"] as? String
        model.created_at = dice["created_at"] as? NSNumber
        model.height = dice["height"] as? NSNumber
        model.id = dice["id"] as? String
        model.new_height = dice["new_height"] as? NSNumber
        model.new_width = dice["new_width"] as? NSNumber
        model.pic_url_d = dice["pic_url_d"] as? String
        model.pic_url_x = dice["pic_url_x"] as? String
        model.price = dice["price"] as? String
        model.title = dice["title"] as? String
        model.width = dice["width"] as? NSNumber
        return model
    }
    // UITableViewDelegate,UITableViewDataSource
    func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
        if tableView.isEqual(self.tableView1) {
            return self.PICModelArray1.count
        }
        if tableView.isEqual(self.tableView2) {
            return self.PICModelArray2.count
        }
        if tableView.isEqual(self.tableView3) {
            return self.PICModelArray3.count
        }
        return 10;
    }
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1;
    }
    // 设置cell的高度
    func tableView(tableView: UITableView,heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        if tableView.isEqual(self.tableView1) {
            let model = self.PICModelArray1[indexPath.row] as PICModel
            let height = model.new_height as! CGFloat
            return height*0.5
        }
        if tableView.isEqual(self.tableView2) {
            let model = self.PICModelArray2[indexPath.row] as PICModel
            let height = model.new_height as! CGFloat
            return height*0.5
        }
        if tableView.isEqual(self.tableView3) {
            let model = self.PICModelArray3[indexPath.row] as PICModel
            let height = model.new_height as! CGFloat
            return height*0.5
        }
        return 10;
    }
    func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let identify:String = "PBTableViewCell"
        let cell:PBTableViewCell = tableView.dequeueReusableCellWithIdentifier(identify)
            as! PBTableViewCell
        cell.selectionStyle = UITableViewCellSelectionStyle.None
        
        var model:PICModel!
        
        if tableView.isEqual(self.tableView1) {
            model = self.PICModelArray1[indexPath.row] as PICModel
        }
        if tableView.isEqual(self.tableView2) {
            model = self.PICModelArray2[indexPath.row] as PICModel
        }
        if tableView.isEqual(self.tableView3) {
            model = self.PICModelArray3[indexPath.row] as PICModel
        }
        
       
        cell.titleLabel?.text = model.title
        // 异步加载图片
        dispatch_async(dispatch_get_global_queue(disPATCH_QUEUE_PRIORITY_DEFAULT,0)) {
            let data = NSData.init(contentsOfURL: NSURL(string: model.pic_url_x!)!)
            dispatch_async(dispatch_get_main_queue(),{ 
                cell.backImageView?.image = UIImage.init(data: data!)
            })
        }
        
        
        return cell
    }
    // 三个TableView 关联滚动
    func scrollViewDidScroll(scrollView: UIScrollView) {
        if scrollView.isEqual(self.tableView1) {
            self.tableView2?.setContentOffset((self.tableView1?.contentOffset)!,animated: false)
            self.tableView3?.setContentOffset((self.tableView1?.contentOffset)!,animated: false)
        }
        if scrollView.isEqual(self.tableView2) {
            self.tableView1?.setContentOffset((self.tableView2?.contentOffset)!,animated: false)
            self.tableView3?.setContentOffset((self.tableView2?.contentOffset)!,animated: false)
        }
        if scrollView.isEqual(self.tableView3) {
            self.tableView1?.setContentOffset((self.tableView3?.contentOffset)!,animated: false)
            self.tableView2?.setContentOffset((self.tableView3?.contentOffset)!,animated: false)
        }
    }
    
    func tableView(tableView: UITableView,didSelectRowAtIndexPath indexPath: NSIndexPath) {
        print("row = \(indexPath.row)")
    }
    
    func tableView(tableView: UITableView,titleForDeleteConfirmationButtonForRowAtIndexPath indexPath: NSIndexPath) -> String? {
        return "删除"
    }
    
    func tableView(tableView: UITableView,commitEditingStyle editingStyle: UITableViewCellEditingStyle,forRowAtIndexPath indexPath: NSIndexPath){
        self.indexPath = indexPath
        self.showAlView(indexPath)
    }
    // UIAlertView的使用
    func showAlView(indexPath :NSIndexPath){
        let alert = UIAlertView.init(title: "警告",message: "确定删除第\(indexPath.row + 1)行",delegate: self,cancelButtonTitle: "取消",otherButtonTitles: "确定")
        alert.show()
    }
    func alertView(alertView: UIAlertView,clickedButtonAtIndex buttonIndex: Int) {
        if (buttonIndex == 0) {
            NSLog("取消");
        }
        else{
            NSLog("删除\(self.indexPath!.row)")
        }
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // dispose of any resources that can be recreated.
    }
}

写在最后:

可能是写的Swift的代码写少了,感觉写起来没有OC顺手,然后自己慢慢体会……O(∩_∩)O哈哈~

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...