#草莓读书2015#阅读《搞定I》有感

NSURLSession帮衬的职分

事先涉嫌的,NSURLSession对象生产互连网请求任务的厂子,它能生成出二种档次的天职:加载数据,下载和上传。而那些任务类就是NSURLSessionTask。
NSURLSessionTask 是一个抽象类,如若要选取那么只可以利用它的子类。

图片 1

NSURLSessionTask.png

  • NSURLSessionDataTask,可以用来拍卖一般的互连网请求,如 GET | POST
    请求等。
  • NSURLSessionUploadTask,用于拍卖上传请求。
  • NSURLSessionDownloadTask,紧要用以拍卖下载请求。

上边我们来详细介绍下两种任务:

《搞定I》是流行全球的经文畅销书《Getting Things
Done——搞定无压工作的措施》那本书的俗称,小编是米利坚的戴维·艾伦。该书推演出来的一套称为“GTD”的工作和岁月管理方法及系统。固然已经问世了三个新春,但依旧是个体保管中GTD的经文之作,值得一看。

③ NSURLSessionDownloadTask

在后面请求数据的时候就一定于一个简单的下载过程,所以说NSURLSessionDataTask也是足以成功简约下载作用的,比如下载图片(请求回图片数据)。
可是相比较普通请求,NSURLSessionDownloadTask的功用越来越有力:

  • 下载文件可以落成断点下载
  • 个中已经落成了边接收数据边写入沙盒的操作(直接下载到磁盘)
  • 帮忙BackgroundSession(后台下载)
    接下去大家来询问一下下载的API,除了通过url或request下载外,还能通过事先早已下载的数码来创立下载任务(也就是大家说的断点续传)。同样地得以由此completionHandler指定职责成功后的回调代码块。

/=========代理方式===========/
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request;  
- (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url;  
//通过之前已经下载的数据来创建下载任务
- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData;  

/=========Block方式===========/
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler;  
- (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler;  
- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler;  

至于断点续传,使用到的任何艺术如下(断点续传的前提是服务器也支撑断点续传):

// 使用这种方式取消下载可以得到将来用来恢复的数据,保存起来
[self.task cancelByProducingResumeData:^(NSData *resumeData) {
    self.resumeData = resumeData;
}];

// 由于下载失败导致的下载中断会进入此协议方法,也可以得到用来恢复的数据
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    // 保存恢复数据
    self.resumeData = error.userInfo[NSURLSessionDownloadTaskResumeData];
}

// 恢复下载时接过保存的恢复数据
self.task = [self.session downloadTaskWithResumeData:self.resumeData];
// 启动任务
[self.task resume];

咱俩举个例子来认识一下平时下载进程(代理格局,需求听从NSURLSessionDelegate,NSURLSessionDownloadDelegate):

- (void)downloadRequest{
    //创建请求
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://httpbin.org/image/jpeg"]];

    //创建配置(决定要不要将数据和响应缓存在磁盘)
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    //创建会话
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];

    NSURLSessionDownloadTask * downloadtask = [session downloadTaskWithRequest:request];
    [downloadtask resume];
}

//1. downloadTask下载过程中会执行
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
    NSLog(@"下载中...");
    NSLog(@"写入数据大小%lld,总写入数据大小%lld,总期望数据大小%lld",bytesWritten,totalBytesWritten,totalBytesExpectedToWrite);
    //监听下载的进度
}
//2.downloadTask下载完成的时候会执行
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
    NSLog(@"下载完成");
       //该方法内部已经完成了边接收数据边写沙盒的操作,解决了内存飙升的问题
    //对数据进行使用,或者保存(默认存储到临时文件夹 tmp 中,需要剪切文件到 cache)

    //保存
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
    [[NSFileManager defaultManager] moveItemAtURL:location toURL:[NSURL fileURLWithPath:filePath] error:nil];

    //使用
    NSData * data = [NSData dataWithContentsOfURL:location.filePathURL];
    UIImage * image = [UIImage imageWithData:data];
    UIImageWriteToSavedPhotosAlbum(image, nil,nil,nil);
}
//3.请求完成或者是失败的时候调用(Session层次的Task完成的事件)
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(nullable NSError *)error{
    NSLog(@"请求完成或者是失败");
}

如果想驾驭一下后台下载,可以看下那篇小说iOS7 Networking with
NSURLSession

5.安排为了把超前的担忧变成超前的思辨和策划

文中提到:当人们把团结的角色从抱怨者和被害人转换成为团结的主宰者时,权力感就发生了。

文中涉及:当您的大脑中爆发了一个清楚的镜像,描绘出你所须求的事物,并且注意于这么些东西时,你的大脑就会自动支持你捕获生活中的相关信息了。

人们常说,布置赶不上变化。还有的人,听外人说在做陈设,就心里嘀咕“有病呢,做怎么着安顿?”其实,出此言者,多为不明了陈设的益处。

能用安插去设计的事情,多是“迫切-紧要四象限”中的第二象限的事体——紧要但不火急的政工。那么些业务,如果不加以关心,当它逐步累积到一定水平,突然间就在某一天暴发成为一件越发急如星火的政工,让你在他的皮鞭追赶下去生活,找不到对生存的掌控感,好像驾驶着船只却抓不住罗盘一样。

我不爱好那种被追着、赶着,喘但是气的生存情景,因而必必要去做陈设。年安排、月安顿还不够,日陈设是更亟待坚持不渝的。

也有人会纳闷,做安排那么多时光,还不如把那些日子向来拿去干活就好了,直接行动啊!然则,殊不知,没有考虑的步履是雾里看花的,很可能就会瞎忙。而制订了安排之后,可以使得裁决,知道不应该投入精力的事务就足以不必去关心,只做少量的那一个可怜紧要的作业。根据二八原则,那样可以一举两得,岂不美哉?

读书最大的益处是可以促使的步履的变动,《搞定I》这本书很好地促动了自己,相对可以给它五星优评。

@发愤的杨梅
( 搜狐搜狐
http://weibo.com/2014study)
【关切】 个人保管、陶文、育儿
【喜欢】 读写、涂鸦、竹笛、EOP
【持之以恒】 做日布置、周回看、记录时间开支、手写活页日记
【发起】 新乡幸福成纽伦堡龙(微信号gerenguanli)
转发本文请注解作者与新浪网址,谢谢!
若是你认为本文让你有得到,不妨花1块8毛8打赏一下作者,——》[猛戳那里][1]
[1]:http://weibo.com/p/1001603795797371171177?

一. 前言

广大人都用过AFNetWorking和SDWebImage,其实底层就是包裹了NSURLSession来呼吁义务。第三方用多了,对于苹果原生的网络请求知识却控制得不够牢固,所以写那篇小说来计算回想一下。

苹果在 iOS9 自此已经屏弃了
NSURLConnection,所以在明天的实际支出中,一般采纳的是
iOS7 之后推出的 NSURLSession。NSURLSession 和 NSURLConnection
都提供了与种种协商,诸如 HTTP 和 HTTPS
,举行互动的API。会话对象(NSURLSession
类对象)就是用来管理那种互相进度。它是一个莫大可配置的器皿,通过动用其提供的APPI,可举办细粒度的管理控制。它提供了在
NSURLConnection 中的所有特性,其余,它还是可以兑现 NSURLConnection
无法形成的义务,例如落到实处私密浏览。

总的说来,NSURLSession 有如下优势:

  • NSURLSession 支持 http2.0 协议
  • 在拍卖下载职责的时候能够一贯把数量下载到磁盘(通过配备)
  • 扶助后台下载|上传(通过配备)
  • 同一个 session 发送多个请求,只需求树立两遍一连(复用了TCP)
  • 提供了全局的 session 并且可以统一配置,使用尤其有利于
  • 下载的时候是三十六线程异步处理,功效更高

积了成百上千迷惑。近期速读那本书,平日为内部的累累段落所“中枪”,峰回路转,决心改进。它让我更确信GTD的火速之处,所有目的的兑现都要藉由聚焦每日的行走去贯彻,而GTD就是最好的行走管理法则。

② NSURLSessionUploadTask

UploadTask继承自DataTask。因为UploadTask只可是在Http请求的时候,把数据放到Http
Body中。所以,用UploadTask来做的事务,平日直接用DataTask也得以兑现。
NSURLSessionUploadTask通过request创造,在上传时指定文件源或数据源,可以用代理或Block指定职务成功后的回调代码。

/=========代理方式===========/
//通过文件url来上传
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL;  
//通过文件data来上传
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData;  
//通过文件流来上传
- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request;

/=========Block方式===========/
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler;  
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler;  

那三种上传格局分别指向怎么着应用场景吧?

  • NSData:如若目的已经在内存里
  • File:假使目的在磁盘上,这样做惹事生非下跌内存使用
  • Stream:通过流对象,你可以毫无两遍性将有着的流数据加载到内存中
    而是使用Stream一定要完毕URLSession:task:needNewBodyStream:,因为Session不可以在重新尝试发送Stream的时候找到数据源。

这边我就举个上传图片的事例:

- (void)uploadRequest{
    //创建请求
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.freeimagehosting.net/upload.php"]];
    //如果是上传文字就是@"application/json"
    [request addValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"];
    [request addValue:@"text/html" forHTTPHeaderField:@"Accept"];
    [request setHTTPMethod:@"POST"];
    [request setCachePolicy:NSURLRequestReloadIgnoringCacheData];
    [request setTimeoutInterval:20];
    NSData * imagedata = UIImageJPEGRepresentation([UIImage imageNamed:@"person"],1.0);

    //创建配置(决定要不要将数据和响应缓存在磁盘)
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    //创建会话
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];

    NSURLSessionUploadTask * uploadtask = [session uploadTaskWithRequest:request fromData:imagedata completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        //发送完成的回调

    }];
    [uploadtask resume];
}
//发送数据过程中会执行(执行多次)
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend{
    NSLog(@"发送数据中");
    //在这边监听发送的进度
    //progress = totalBytesSent/(float)totalBytesExpectedToSend
}

此次阅读,使我结合正在进行的经历,形成了几点越来越坚定的认识。

① NSURLSessionDataTask

大家得以经过request对象或url创立NSURLSessionDataTask对象。也得以选拔用代理或者Block来接收数据。

//这两个方法需要设置代理来接收数据
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request;
- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url;

//这两个方法在completionHandler来接收数据
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;

接纳Block的回调接收数据的点子相比较简单,但是却绝非设置代理,通过代理获取数据来得灵活。那边重点介绍代理的法门,顺便回看一下下边所讲的NSURLSession的布置和开创。

以下就各自举五个例子来评释(代理和Block):
(1)代理的点子:
代理的法门的话须求设置代理人,遵循协议NSURLSessionDelegate和NSURLSessionTaskDelegate。
说到协和,多少个类都有对应的商事,比如NSURLSessionDataTask就相应NSURLSessionDataDelegate,该协议主要用来处理dataTask的数据处理(比如收受到响应,接收到数量,是还是不是缓存数据)。此外,也时常须求坚守公共的商议:NSURLSessionDelegate和NSURLSessionTaskDelegate。
NSURLSessionDelegate紧要关于会话的,比如会话关闭,会话收到挑衅。
NSURLSessionTaskDelegate紧要关于任务的,可以清楚为天职共用的协议,比如义务到位或破产,职务收到挑衅,职分即将执行HTTP重定向。

还有一个第一,就是有关缓存。
事先涉嫌的NSURLSession默许的对话形式,也就是defaultSessionConfiguration的布署,可以将缓存存储在磁盘上(本质就是应用NSURLCache,具体介绍可以看那边作品NSURLCache缓存使用简介)。
路线是沙盒路径下Library/Caches/bundid/Cache.db(对于webview的缓存,也一律,因为它也是用的NSURLCache)。

其余,还有一个周边的装置就是cachePolicy(缓存策略),该装置决定要不要从缓存中获得,比如request.cachePolicy = NSURLRequestUseProtocolCachePolicy。以下还有三种政策:

typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)
{
    //对特定的 URL 请求使用网络协议中实现的缓存逻辑。这是默认的策略。
    NSURLRequestUseProtocolCachePolicy = 0,

    //数据需要从原始地址加载。不使用现有缓存。
    NSURLRequestReloadIgnoringLocalCacheData = 1,

    // 不仅忽略本地缓存,同时也忽略代理服务器或其他中间介质目前已有的、协议允许的缓存。
    NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, 

    NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,

    //无论缓存是否过期,先使用本地缓存数据。如果缓存中没有请求所对应的数据,那么从原始地址加载数据。
    NSURLRequestReturnCacheDataElseLoad = 2,

    //无论缓存是否过期,先使用本地缓存数据。如果缓存中没有请求所对应的数据,那么放弃从原始地址加载数据,请求视为失败(即:“离线”模式)。
    NSURLRequestReturnCacheDataDontLoad = 3,

    //从原始地址确认缓存数据的合法性后,缓存数据就可以使用,否则从原始地址加载。
    NSURLRequestReloadRevalidatingCacheData = 5, 
};

事例中,咱们设置了默许配置,请求的缓存策略为NSURLRequestReturnCacheDataElseLoad,那样当我们发送一个请求后,就会将数据和响应保存在沙盒中的数据库,当大家下次发送请求,会先从缓存中找,找不到再去服务器找。

#import "ViewController.h"

@interface ViewController ()<NSURLSessionDelegate,NSURLSessionTaskDelegate>
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self sendRequest];
}
- (void)sendRequest{
    //创建请求
    NSURL *url = [NSURL URLWithString:@"http://httpbin.org/get"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    //设置request的缓存策略(决定该request是否要从缓存中获取)
    request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

    //创建配置(决定要不要将数据和响应缓存在磁盘)
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    //configuration.requestCachePolicy = NSURLRequestReturnCacheDataElseLoad;

    //创建会话
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
    //生成任务
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
    //创建的task是停止状态,需要我们去启动
    [task resume];
}
//1.接收到服务器响应的时候调用
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
 completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler{
    NSLog(@"接收响应");
    //必须告诉系统是否接收服务器返回的数据
    //默认是completionHandler(NSURLSessionResponseAllow)
    //可以再这边通过响应的statusCode来判断否接收服务器返回的数据
    completionHandler(NSURLSessionResponseAllow);
}
//2.接受到服务器返回数据的时候调用,可能被调用多次
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{
    NSLog(@"接收到数据");
    //一般在这边进行数据的拼接,在方法3才将完整数据回调
//    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
}
//3.请求完成或者是失败的时候调用
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(nullable NSError *)error{
    NSLog(@"请求完成或者是失败");
    //在这边进行完整数据的解析,回调
}
//4.将要缓存响应的时候调用(必须是默认会话模式,GET请求才可以)
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
 willCacheResponse:(NSCachedURLResponse *)proposedResponse
 completionHandler:(void (^)(NSCachedURLResponse * _Nullable cachedResponse))completionHandler{
    //可以在这边更改是否缓存,默认的话是completionHandler(proposedResponse)
    //不想缓存的话可以设置completionHandler(nil)
    completionHandler(proposedResponse);
}
@end

(2)Block的方式:

NSURL *url = [NSURL URLWithString:@"http://www.connect.com/login"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
request.HTTPBody = [@"username=Tom&pwd=123" dataUsingEncoding:NSUTF8StringEncoding];

//使用全局的会话
NSURLSession *session = [NSURLSession sharedSession];
// 通过request初始化task
NSURLSessionTask *task = [session dataTaskWithRequest:request
                                   completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
    NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
 }];
//创建的task是停止状态,需要我们去启动
[task resume];

2.瞩目区分出哪些收集到的始末是系列的救助音讯

文中提到:项目支撑资料不是类其他走动,也不是项目提醒。它只是支撑项目行动和决定的扶助信。

文中涉及:倘诺你对活页本或者安排手册情有独钟的话,一定要存储丰富的空白页,那样每当一个宗旨或者项目出现时,你就足以立刻为它配置上一页。

在收集箱中,日常会收集到部分说不出类其他始末,说它是行走,又不像,说它不是行动吗,它又真正是跟某些事情项目有关的主旨。经过书上此话点拨,才晓得,原来收集的内容,除了可能是行走,可能是系列,还有可能是“项目的接济资料”。

诸如看到某个东西越发风趣,心里很想买,就会把它存入收集箱,在处理和团队的经过中,如若把“想买某物”放到“未来恐怕”的版块中,很不难就会堆积太多的始末在这几个版块里,以致于检视那几个版块时耗时过多

今昔,我能窥见到,在doit.im收集箱出现的始末,不肯定最后必将会流转到这么些软件的其余版块,是先前的思辨受拘束了。现在,我会在活页纸万用手册中开出几张空白页,收集种种各个的不吻合录入doit“未来或者”版块的始末,比如一些关爱的书名录入doit收集箱后,我就会把它抄入万用手册活页纸“想买的书”那么些项目标页面。

一. NSURLSession的介绍

4.近日关爱的档次需求日布置时都看一遍

人的大脑有限,记不住太多的事物,有些你以为理所当然会铭记的情节,可能刚刚在大忙起来就记不清了。由此,亟待日常去检查关注的种类,唤起自己的灵感,以便于对行动的进行预判

假定能养成天天都看一下都要关爱哪些项目,有些事情就好办了。

诸如每个月要定位达成的若干个习惯,它们并未定点时段的渴求,只须要有时候尽快形成就好。对于这么些习惯,我时常至极头痛如何设定提醒形式的难题。等到看完那本书,突然就有热点了。可以把那一个习惯以“某月月习惯”为名存入doit.im作为一则项目,这么些具体的习惯作为项指标内容自然都进入了“下一步行动”。每天做布置一旦预测到前些天有时间,会在检察时任天由命地把它们拉入“明日施行”,于是便得以逐步把月习惯落实已毕。

NSURLSession的布局和创办

NSURLSession对象是一个会话,你可以把他正是是生育网络请求职责的工厂。NSURLSession有二种工作情势:

  • 默认会话形式(default):工作格局类似于原来的NSURLConnection,使用的是依据磁盘缓存的持久化策略,使用用户keychain中保留的注解进行求证授权。

  • 转眼对话方式(ephemeral):该方式不应用磁盘保存任何数据。所有和对话相关的caches,证书,cookies等都被保存在RAM中,由此当程序使会话无效,那个缓存的数目就会被活动清空。(可以兑现私密浏览)

  • 后台会话情势(background):该方式在后台完毕上传和下载(在系统的一个单身的长河中履行),在开立Configuration对象的时候须要提供一个NSString类型的ID用于标识完结工作的后台会话。

简短点清楚,就是区其余做事形式用来缓解不一样的网络请求场景,当您须求缓存会话相关的caches,证书,cookies等是就动用默许会话情势,不须求就用弹指时对话格局,须要在后台举办上传下载就用后台会话格局。

那怎么设置那个方式呢?
那么些干活儿形式是由NSURLSessionConfiguration决定的。以下三种创造方式挨个对应NSURLSession的二种工作情势,其实本质上仍旧NSURLSessionConfiguration内部属性所主宰,也省得大家逐条去设置。

+ (NSURLSessionConfiguration *)defaultSessionConfiguration;  
+ (NSURLSessionConfiguration *)ephemeralSessionConfiguration;  
+ (NSURLSessionConfiguration *)backgroundSessionConfiguration:(NSString *)identifier; 

一个NSURLSessionConfiguration对象定义的一颦一笑和方针被用来拔取NSURLSession上传和下载数据,创制一个布署对象始终是您不可能不使用的率先步。你可以动用这一个目的去布置你想要使用的NSURLSession对象的超时时间、缓存策略、连接请求以及其余项目标新闻。
以下大家精通下NSURLSessionConfiguration的常见属性(借使想打听越来越多属性,可以看这篇文章NSURLSessionConfiguration详解):

//如果在后台任务正在传输时程序退出,可以使用这个identifier在程序重新启动是创建一个新的configuration和session关联之前传输。
@property(readonly, copy) NSString  *identifier;

//默认为空,NSURLRequest附件的请求头。
//这个属性会给所有使用该configuration的session生成的tasks中的NSURLRequest添加额外的请求头。
//如果这里边添加的请求头跟NSURLRequest中重复了,侧优先使用NSURLRequest中的头
@property(copy) NSDictionary  *HTTPAdditionalHeaders;

//是否使用蜂窝网络,默认是yes.
@property BOOL allowsCellularAccess;

//给request指定每次接收数据超时间隔
//如果下一次接受新数据用时超过该值,则发送一个请求超时给该request。默认为60s
@property NSTimeInterval  timeoutIntervalForRequest;

//给指定resource设定一个超时时间,resource需要在时间到达之前完成
//默认是7天。
@property NSTimeInterval  timeoutIntervalForResource;

//discretionary属性为YES时表示当程序在后台运作时由系统自己选择最佳的网络连接配置,该属性可以节省通过蜂窝连接的带宽。
//在使用后台传输数据的时候,建议使用discretionary属性,而不是allowsCellularAccess属性,因为它会把WiFi和电源可用性考虑在内。
@property (getter=isDiscretionary) BOOL discretionary;

//表示当后台传输结束时,是否启动app.这个属性只对 生效,其他configuration类型会自动忽略该值。默认值是YES。
@property BOOL sessionSendsLaunchEvents;

//是否启动通道,可以用于加快网络请求,默认是NO
@property BOOL HTTPShouldUsePipelining;

/===========储存的相关属性=============/

//存储cookie,清除存储,直接set为nil即可。
//对于默认和后台的session,使用sharedHTTPCookieStorage。
//对于短暂的session,cookie仅仅储存到内存,session失效时会自动清除。
@property(retain) NSHTTPCookieStorage  *HTTPCookieStorage;

//默认为yes,是否提供来自shareCookieStorge的cookie
//如果想要自己提供cookie,可以使用HTTPAdditionalHeaders来提供。
@property BOOL  HTTPShouldSetCookies;

//证书存储,如果不使用,可set为nil.
//默认和后台session,默认使用的sharedCredentialStorage.
//短暂的session使用一个私有存储在内存中。session失效会自动清除。
@property(retain) NSURLCredentialStorage *URLCredentialStorage;

//缓存NSURLRequest的response。
//默认的configuration,默认值的是sharedURLCache。
//后台的configuration,默认值是nil
//短暂的configuration,默认一个私有的cache于内存,session失效,cache自动清除。
@property(retain) NSURLCache  *URLCache;

//缓存策略,用于设置该会话中的Request的cachePolicy,如果Request有单独设置的话,以Request为准。
//默认值是NSURLRequestUseProtocolCachePolicy
@property NSURLRequestCachePolicy requestCachePolicy;

那我们该怎么开创想要的对话对象呢?总共有二种创设情势,咱们得以创立对应的配置类(NSURLSessionConfiguration)来计划。

//使用静态的sharedSession方法,该类使用共享的会话,该会话使用全局的Cache,Cookie和证书
+ (NSURLSession *)sharedSession;  

//通过sessionWithConfiguration:方法创建对象,也就是创建对应配置的会话,与NSURLSessionConfiguration合作使用
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration;  

//通过设置配置、代理、队列来创建会话对象
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(id <NSURLSessionDelegate>)delegate delegateQueue:(NSOperationQueue *)queue; 

二三三种方法可以创立一个新会话并定制其会话类型。该办法中指定了session的信托和信托所处的队列。当不再须要接二连三时,可以调用Session的invalidateAndCancel直白关闭,或者调用finishTasksAndInvalidate等候眼前Task截至后关门。这时Delegate会收到URLSession:didBecomeInvalidWithError:本条事件。Delegate收到那几个事件未来会被解引用。

鲁人持竿GTD的原理使用doit.im举行行动管理已经有一段时间,时期也累

1.收集箱要常清常空

文中涉及:当你对个人保管连串失去控制的时候,往往更易于倾向于应付手头上那么些永不分外根本的工作,大家寻常以此为借口逃避堆积如山的劳作。

文中涉及:成功征集的两个要求条件:(1)每一个悬而未决的作业都必须存储于你的采集系统之中,而不是在您的大脑里。(2)你应有尽量地操纵收集工具的多寡,越少越好、够用即可。(3)你必须定期地清空这一个设施。

得逞采集的三个要求条件中,前八个尺码,我都能细水长流好,但第多个,有时会做不做到。doit.im的收集箱有时堆积得多起来,心里就会暴发完全不想去碰它的想法,不信任它,进而前面的环节被打乱了。doit.im是自个儿的天天行动管理种类,假设我很长日子未曾对这一个系统进行清理和更新的话,系统会远远滞后于客观情状,更新三回系统将会相比较费力,无法担保它的有效性,你会初始不去看收集箱,反而把注意力投放在那多少个迫在眉睫但不重大的政工上。

由来之一是清空收集箱的习惯还不够巩固,原因之二是过多业务都想成功,总想周全,所以先前在处理收集箱时,总不愿删除一些不可能应付的事情。但真相是人的生气是有限的,只可以挑首要的去落成。好在做了当年年度目的和安排之后,在甄选那上头有正式了。学会放任一些事情,做做“减法生活”,在清空收集箱上的主动自然增进了。

为了巩固清空收集箱的习惯,给自己做了个《新习惯登记表》,明确了清空收集箱的每天最佳预期时间、成功百折不挠100天的嘉奖,以及失利的惩处。措施是有效的,那段日子来说,收集箱保持极高的清爽度。

@发愤的草莓的《新习惯登记表》.jpg

3.“重行动,轻思考”是不可取的

文中涉及:学会在日常工作中不断问自己“我怎么要做那些?”、“那事情若是做成了会是怎么着样子?”才是最管用的——那会对您发出极为深切的震慑。

先前,灵感一出现,就想立刻起头去付诸行动,可以说是,重行动,轻思考。而GTD则更是强调行动前须求大批量合计的做法。

如此做的裨益是,想了解那些行动想要做到一个如何的功效,已毕未来会合世哪些的图景,对于盘活行动本身很有引导意义。

比如说“上乐乎看看知识管理的出色帖子”那则走路提醒,因为没有写明想要做到怎么着的效果,所以写完后去实施时,不亮堂怎么时候可以停下来,把那则走路打勾作为“已成功”的行进。

就此,在行进前,要想想精通究竟自己的目标是怎么着。借使把它改成“上搜狐找到知识管理的精粹帖子,抄录其中优质的情节,以便于举行实施”,那样做起来就清清楚楚多了。因此及彼,我也想到了年度目的的制定,最好在表述中也能写清楚自己这些目的想要达到的成效,在推行时才不会犯晕。

此外,在有活力和岁月考虑时,就批量地思索和拍卖一堆收集到的始末,把它们加工为可以推行的行路提醒,而等到有时间和规范去行动时,就批量地按行进提醒平昔去履行,不需求再过量地挂念了,可以有效地节约差异行为之间的切换时间

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注