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

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

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

效果图:



Demo工作流程:

1.制作三个tableiView

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

3.数据封装成模型

4.reload tableView

图片数据模型

Swift UITableView瀑布流/NSURLConnection异步网络请求_第1张图片

代码:

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, 20, 100, 548))
        self.tableView2!.delegate = self
        self.tableView2!.dataSource = self;
        self.tableView2?.showsVerticalScrollIndicator = false
        self.tableView2!.registerNib(UINib(nibName:"PBTableViewCell", bundle:nil),
                                     forCellReuseIdentifier:"PBTableViewCell")
        self.view .addSubview(self.tableView2!)
        
        self.tableView3 = UITableView.init(frame: CGRectMake(215, 20, 100, 548))
        self.tableView3!.delegate = self
        self.tableView3!.dataSource = self;
        self.tableView3?.showsVerticalScrollIndicator = false
        self.tableView3!.registerNib(UINib(nibName:"PBTableViewCell", bundle:nil),
                                     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哈哈~

github代码地址:请点击我


你可能感兴趣的:(瀑布流,NSURLConnection)