• 网络数据的下载(NSUrlconnection异步下载和NSstring同步下载)和UI界面数据的刷新(都是抛弃第三方库的一些本质)


    <1>NSString同步下载
            //字符串的类方法,会根据url向服务器发起同步的数据请求,并将请求结果作为返回值
        //同步请求数据,会对程序的UI主线程造成阻塞,用户体验极差

     NSString *str = [NSString stringWithContentsOfURL:[NSURL URLWithString:kUrl] encoding:NSUTF8StringEncoding error:nil];
        //json格式的数据 进行json解析 数据最外层是 字典 用NSDictionary接收
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:nil];

    1、字符串同步处理函数:  
    + (id)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error: (NSError **)error;
     2、二进制同步读取函数:
    + (id)dataWithContentsOfURL:(NSURL *)url;
     3、图片同步下载函数:
     + (id) imageWithContentsOfFile:(NSString *)path;
    <2>NSURLConnection异步下载[核心和重点, 项目中使用]
     NSURLConnection  一旦创建 立即会启动一个子线程(子线程 来建立 客户端和服务端的连接 和接收数据等,主线程 主要还是负责界面的数据刷新) 把客户端和服务端 连接起来之后 把客户端的请求(get请求:一般用于从服务端获取数据,不安全 :get请求 需要把 服务端的地址和参数 一起捆绑 封装成一个url 发送给服务端) 发送给服务端  
    异步下载的顺序:
    1. 起一个线程(建立连接)由客户端 向 服务端发送请求
    2.服务端 给 客户端响应 --》客户端接收响应
    3.服务端 开始发送数据--》客户端收数据
    4.服务端 发送结束  客户端 接收完毕
    下载完之后 客户端来进行解析数据
     项目中的综合使用
    项目:     QFSNS客户端--即时聊天类客户端----类似QQ,微信
    需求:        实现一个界面,  显示用户列表
        项目: 从下载到显示的完整流程
            <1>获取网络接口(服务端提供, 抓包, 开源接口)
    http://10.0.8.8/sns/my/user_list.php
    http://10.0.8.8/sns/my/user_list.php?page=1&number=20
    http://10.0.8.8/sns/my/user_list.php?page=%d&number=%d
            <2>异步下载数据
            <3>Json解析
            <4>建立数据模型并解析
            <5>表格视图显示(cell的定制)
            <6>SDWebImage异步显示图片
                    (1)库导入中项目(拖进来即可)
                    (2) ARC和非ARC混编
                    如果是ARC项目,  SD库是非arc 那么需要设置非ARC编译,      -fno-objc-arc
                    如果工程是非arc的, sd 库 是arc 的那么需要按照arc 编译  -fobjc-arc
                    (3)导入头文件 #import "UIImageView+WebCache.h"
                    (4)显示图片 [cell.headImageView setImageWithURL:[NSURL URLWithString:headImageUrl]];
        @"http://10.0.8.8/sns/" + imageUrl

        /*
         SDWebImage 是用arc写 的
         当前程序 默认是非arc 的代码  那么这时我们需要进行混合编译
          把SDWebImage的源码 在xcode 的build phase 选中 所有的SDWebImage的代码 文件 添加编译标记 -fobj-arc (表示 这些代码使用 arc 编译)
         */
          // SDWebImage下载图片是异步的 下载完成之后 会自动放在沙盒 中的Library/Cache/com.hackemist.SDWebImageCache.default 目录下作为缓存,下次再加载同一个 如果缓存有那么就直接从缓存获取,如果没有再异步下载
        // SDWebImage自带缓存功能
        //在沙盒的Libarary/Cache中创建文件夹ImageCache 所有的图片都会缓存在该文件夹下
        // 先去磁盘中判断该图片是否存在 如果存在不下载 不存在下载
        SDImageCache * cache = [SDImageCache sharedImageCache];
        // 1.内存
        [cache clearMemory];
        // 1.磁盘
        [cache clearDisk];


    三、下拉刷新 上拉加载更多

    a. UIRefreshControl
    /*
     iOS6之后
     1.创建一个UIRefreshControl 对象 (可以不设置大小和坐标)
     2.设置UIRefreshControl 对象 属性 增加 事件(下拉到一定程度松手就会触发事件)
     3.粘贴到要刷新的tableView上
     4. 实现增加事件触发的方法 (在这个方法内进行刷新数据)
     5.数据下载完之后要 停止刷新   [_refreshControl endRefreshing];
     
    */

    //事件驱动型控件
        _refreshControl = [[UIRefreshControl  alloc] init];
        //属性字符串
        _refreshControl.attributedTitle = [[[NSAttributedString alloc] initWithString:@"下拉刷新"] autorelease];
        //设置背景
        _refreshControl.tintColor = [UIColor redColor];
        //增加 触发事件  值改变的时候
        [_refreshControl addTarget:self action:@selector(updateData:) forControlEvents:UIControlEventValueChanged];
        _refreshControl.backgroundColor = [UIColor yellowColor];
        //粘贴到tableView
        [self.tableView addSubview:_refreshControl];



    b.  EGO   

    1.把第三方库导入工程
    2.#import "EGORefreshTableHeaderView.h"
    3.需要刷新的界面   遵守协议
    4.//创建在tableview的上方

    - (void)creatEGOHeardView{
        _heardView = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0, -self.tableView.bounds.size.height, self.tableView.bounds.size.width, self.tableView.bounds.size.height)];
        //设置代理
        _heardView.delegate = self;
          //设置最近刷新时间
        [_heardView refreshLastUpdatedDate];
        [self.tableView addSubview:_heardView];
    }
    #pragma mark - 要实现scrollView协议的方法
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
        //滚动视图滚动的时候要调用
        [_heardView egoRefreshScrollViewDidScroll:scrollView];
    }
    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
        //停止拖拽的时候调·用
        [_heardView egoRefreshScrollViewDidEndDragging:scrollView];
    }

    #pragma mark - EGO 协议中的方法
    //返回当前是否正在刷新,如果正在刷新那么就 不刷新了
    //返回的是YES 表示正在刷新 那么这个时候就不刷新
    //返回的时NO 表示当前没有刷新 可以刷新
    - (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView *)view{
        return _isRefreshing;
    }
    //刷新的时候调用
    - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view{
        if (_isRefreshing) {
            return;
        }
        _isRefreshing = YES;
        _currentPage = 1;
        [self loadDataPage:_currentPage count:20];
    }
    //返回最近刷新的时间
    - (NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView *)view{
        return [NSDate date];
    }
    最后
    [self.tableView reloadData];
        //设置为NO 表示当前没有下载了
        _isLoading = NO;
        //刷新结束
        _isRefreshing = NO;
         //已经完成更新 要停止刷新
        [_heardView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];

  • 相关阅读:
    vue中minxin---小记
    微信认证
    Fatal error Using $this when not in object context in
    $.ajax()方法详解
    $.post
    jquery中的each
    jquery的$.extend和$.fn.extend作用及区别
    javascript字符串函数
    serializeArray()与serialize()的区别
    一个登陆界面
  • 原文地址:https://www.cnblogs.com/ZSongChao001/p/4957323.html
Copyright © 2020-2023  润新知