iOS 开发指南 第15章 访问Web Service之使用轻量级网络请求架构MKNetworkKIt

除苹果提供的NSURLConnection和NSURLRequest外第三方的网络框架

1 安装和配置MKNetworkKit框架

下载并打开MKNetworkKit目录添加MKNetworkKit文件夹到新工程中-添加支持的类库或框架 CFNetwork.framework SystemConfiguration.framework Security.framework-添加预编译头文件

#ifndef MyNotes/MyNotes-Prefix.pch

#define MyNotes/MyNotes-Prefix.pch

#import <Foundation/foundation.h>

#endif

2 网络请求

MKNetworkOperation:封装了请求相应的类,我们需要为每一个网络请求创建一个MKNetworkOperation。

MKNetworkEngine:负责管理网络队列,简单请求时直接使用,复杂情况时可以子类化MKNetworkEngine。

1)实现GET请求

/*
 * 开始请求Web Service
 */
-(void)startRequest
{   设置请求路径,它是主机名(域名或ip地址)之后的内容。
    NSString *path = [[NSString alloc] initWithFormat:@"/service/mynotes/WebService.php?email=%@&type=%@&action=%@",@"<你的51work6.com用户邮箱>",@"JSON",@"query"];
    创建MKNetworkEngine对象,参数是主机名和请求头,主机名前面不加http或www。
    MKNetworkEngine *engine = [[MKNetworkEngine alloc] initWithHostName:@"51work6.com" customHeaderFields:nil];    创建MKNetworkOperation对象,参数是主机名之后的内容。其他参数有params:请求参数 httpMethod:指定请求方法 ssl:是否使用ssl加密请求
    MKNetworkOperation *op = [engine operationWithPath:path];

    指定请求闭包,成功回调第一个代码块,失败回调第二个。
    [op addCompletionHandler:^(MKNetworkOperation *operation) {
    获取从服务器返回的NSData类数据 字符串 responseImage    NSLog(@"responseData : %@", [operation responseString]);    NSData *data  = [operation responseData];    解析数据      NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
        [self reloadView:resDict];

    } errorHandler:^(MKNetworkOperation *errorOp, NSError* err) {
        NSLog(@"MKNetwork请求错误 : %@", [err localizedDescription]);
    }];    开始发起请求
    [engine enqueueOperation:op];

}

2)实现POST请求

/*
 * 开始请求Web Service
 */
-(void)startRequest
{
    NSString *path = [[NSString alloc] initWithFormat:@"/service/mynotes/WebService.php?email=%@&type=%@&action=%@",@"<你的51work6.com用户邮箱>",@"JSON",@"query"];
为MKNetworkOperation指定请求参数
    NSMutableDictionary *param = [[NSMutableDictionary alloc] init];
    [param setValue:@"<你的51work6.com用户邮箱>" forKey:@"email"];
    [param setValue:@"JSON" forKey:@"type"];
    [param setValue:@"query" forKey:@"action"];

    MKNetworkEngine *engine = [[MKNetworkEngine alloc] initWithHostName:@"51work6.com" customHeaderFields:nil];
    MKNetworkOperation *op = [engine operationWithPath:path params:param httpMethod:@"POST"];

    [op addCompletionHandler:^(MKNetworkOperation *operation) {

        NSLog(@"responseData : %@", [operation responseString]);
        NSData *data  = [operation responseData];
        NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
        [self reloadView:resDict];

    } errorHandler:^(MKNetworkOperation *errorOp, NSError* err) {
        NSLog(@"MKNetwork请求错误 : %@", [err localizedDescription]);
    }];
    [engine enqueueOperation:op];

}

3 下载数据

MKNetworkOperation类不仅可以指定下载文件的位置,还可以获得下载的进度。

- (IBAction)onClick:(id)sender {
    获取缓存目录
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cachesDirectory = paths[0];
    NSString *downloadPath = [cachesDirectory stringByAppendingPathComponent:@"test1.jpg"];

    NSString *path = [[NSString alloc] initWithFormat:@"/service/download.php?email=%@&FileName=test1.jpg",@"<你的51work6.com用户邮箱>"];
    path = [path stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
    MKNetworkEngine *engine = [[MKNetworkEngine alloc] initWithHostName:@"51work6.com" customHeaderFields:nil];
    MKNetworkOperation *downloadOperation = [engine operationWithPath:path params:nil httpMethod:@"POST"];    添加NSOutputStream输出流对象,它指定下载图片的位置。
    [downloadOperation addDownloadStream:[NSOutputStream outputStreamToFileAtPath:downloadPath append:TRUE]];
    将下载进度进行日志输出
    [downloadOperation onDownloadProgressChanged:^(double progress) {
        NSLog(@"download progress: %.2f%%", progress*100.0);
        _progressView.progress = progress;
    }];
    闭包
    [downloadOperation addCompletionHandler:^(MKNetworkOperation *operation) {

        NSLog(@"download file finished!");
        NSData *data = [operation responseData];

        if (data) {
            //返回数据失败
            NSError *eror;
            NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&eror];
            if (!resDict) {
                NSNumber *resultCodeObj = [resDict objectForKey:@"ResultCode"];

                NSString *errorStr = [resultCodeObj errorMessage];
                UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"错误信息"
                                                                    message:errorStr
                                                                   delegate:nil
                                                          cancelButtonTitle:@"OK"
                                                          otherButtonTitles: nil];
                [alertView show];
            }
        } else {
            //返回数据成功
            UIImage *img = [UIImage imageWithContentsOfFile:downloadPath];
            _imageView1.image = img;
        }

    } errorHandler:^(MKNetworkOperation *errorOp, NSError* err) {
        NSLog(@"MKNetwork请求错误 : %@", [err localizedDescription]);
    }];

    [engine enqueueOperation:downloadOperation];
}

4 上传数据

- (IBAction)onClick:(id)sender {

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test2" ofType:@"jpg"];

    NSString *path = [[NSString alloc] initWithFormat:@"/service/upload.php"];

    NSMutableDictionary *param = [[NSMutableDictionary alloc] init];
    [param setValue:@"<你的51work6.com用户邮箱>" forKey:@"email"];

    MKNetworkEngine *engine = [[MKNetworkEngine alloc] initWithHostName:@"51work6.com" customHeaderFields:nil];
    MKNetworkOperation *op = [engine operationWithPath:path params:param httpMethod:@"POST"];
    提供要上传的文件路径和文件类型
    [op addFile:filePath forKey:@"file"];    冻结操作:断网时保存数据 连网后自动上传保存的数据
    [op setFreezable:YES];

    [op addCompletionHandler:^(MKNetworkOperation *operation) {

        NSLog(@"Upload file finished!");
        NSData *data = [operation responseData];

        if (data) {

            NSError *eror;
            NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&eror];
            if (resDict) {解析好的数据
                NSNumber *resultCodeObj = [resDict objectForKey:@"ResultCode"];

                NSString *errorStr = [resultCodeObj errorMessage];自定义
                UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"错误信息"
                                                                    message:errorStr
                                                                   delegate:nil
                                                          cancelButtonTitle:@"OK"
                                                          otherButtonTitles: nil];
                [alertView show];
                return ;
            }
        }
        [self seeImage];

    } errorHandler:^(MKNetworkOperation *errorOp, NSError* err) {
        NSLog(@"MKNetwork请求错误 : %@", [err localizedDescription]);
    }];
    [engine enqueueOperation:op];
}
时间: 2024-08-25 19:56:32

iOS 开发指南 第15章 访问Web Service之使用轻量级网络请求架构MKNetworkKIt的相关文章

iOS 开发指南 第15章 访问Web Service之REST Web Service

***** 在电脑术语中,统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一互联网资源名称的字符串. 该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作.URI由包括确定语法和相关协议的方案所定义. Web上可用的每种资源 -HTML文档.图像.视频片段.程序等 - 由一个通用资源标识符(Uniform Resource Identifier, 简称"URI")进行定位. ***** 1 REST Web Ser

iOS 开发指南 第15章 访问Web Service之数据交换格式

“自描述的”结构化文档 1 XML文档结构 声明:定义了XML文件的版本和使用的字符集 <> 根元素:开始标签  结束标签 子元素:开始标签 结束标签 属性:  定义在开始标签中 属性名 属性值(放置在双引号或单引号之间) 一个元素不能有多个名字相同的属性. 命名空间:为XML文档提供名字唯一的元素和属性 ************ XML 命名空间提供避免元素命名冲突的方法. XML Namespace (xmlns) 属性 XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:

iOS 开发指南 第15章 访问Web Service之反馈网络信息改善用户体验

1 使用下拉刷新控件改善用户体验 表视图UIRefreshControl类型的refreshControl属性,不需要考虑控件布局问题 初始化: 设置attributedTitle属性 添加事件处理机制 - (void)viewDidLoad { [super viewDidLoad]; //查询请求数据 action = QUERY; [self startRequest]; //初始化UIRefreshControl UIRefreshControl *rc = [[UIRefreshCon

iOS开发指南 第8章 iOS常用设计模式 学习

设计模式是在特定场景下对特定问题的解决方案 1 单例模式 作用:解决“应用中只有一个实例”的问题,这个实例的作用是全局的,比如说是可以实现一些共享资源 方法的访问和状态的保持 实现原理:一般会封装一个静态属性,并提供静态实例的创建方法. *********** James Rumbaugh对类的定义是:类是具有相似结构.行为和关系的一组对象的描述符.类是面向对象系统中最重要的构造块.类图显示了一组类.接口.协作以及他们之间的关系. 建立类图的步骤: (1)研究分析问题领域确定系统需求. (2)确

IOS开发指南第四章 IOS8多分辨率屏幕适配 学习

1 获取IOS设备屏幕信息 CGSize iOSDeviceScreenSize = [UIScreen mainScreen].bounds.size; NSString *s = [NSString stringWithFormat:@"%.0f x %.0f", iOSDeviceScreenSize.width, iOSDeviceScreenSize.height]; 获取设备信息判断是否是ipone-判断横屏还是竖屏-判断设备型号 属性userInterfaceIdiom是

iOS 开发指南 第12章 应用程序设置

1 概述 设置中的项目在应用中是不经常变化的,它决定了应用的基本特征和行为. 配置是在应用内部开辟出来的功能块,是应用的一部分,项目是经常变化的. 2 应用程序设置包 Settings Bundle是一个包文件,其中含有设置界面中所需的项目的描述 用到的照片 文字的本地化 子设置项目的描述等内容.通过finder打开. Root.plist文件描述根设置界面中设置的项目信息. en.lproj文件夹和Root.strings文件是和本地化有关,用于设置界面信息的本地化. 创建:iOS-Resou

iOS 开发指南 第11章 数据持久化之属性列表 学习

1 概述 沙箱目录:一种安全策略,原理是只能允许自己的应用访问目录,而不许其他应用访问. 子目录:Documents 用于储存非常大的文件或需要非常频繁更新的数据 NSArray *documentDirectory=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES): documentDirectory是只有一个元素的数组,还需要取出路径 NSString *myDocPath=[docum

iOS 开发指南 第16章 定位服务与地图应用之使用苹果地图

1 显示地图 MKMapView MKMapViewDelegate 准备:加载MapKit.framework 设置地图样式 代理-实现代理方法 - (void)viewDidLoad { [super viewDidLoad]; 设置样式,枚举类型MKMapType self.mapView.mapType = MKMapTypeStandard; // self.mapView.mapType = MKMapTypeSatellite; 将当前视图控制器赋值给地图视图的delegate属性

IOS 开发指南 第三章学习

1 uiwindow 的rootwiew决定了应用程序的类型 2 反映视图关系的3个属性 superview:有且仅有一个(除了uiwindow) subviews:子视图的集合 window:获得当前视图的uiwindow对象 3 按钮至少有两种:uibutton uibarbuttonitem 4 selector是一个指针变量,意思是将方法指定给控件去做 sender是事件源,指要使用这个方法的控件对象 5 使控件的事件与动作关联在一起 1)addTarget:action:forCont