标签:
Listing 1-1 Sample delegate class interface #import <Foundation/Foundation.h> typedef void (^CompletionHandlerType)(); @interface MySessionDelegate : NSObject <NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate> @property NSURLSession *backgroundSession; @property NSURLSession *defaultSession; @property NSURLSession *ephemeralSession; #if TARGET_OS_IPHONE @property NSMutableDictionary *completionHandlerDictionary; #endif - (void) addCompletionHandler: (CompletionHandlerType) handler forSession: (NSString *)identifier; - (void) callCompletionHandlerForSession: (NSString *)identifier; @end
#if TARGET_OS_IPHONE self.completionHandlerDictionary = [NSMutableDictionary dictionaryWithCapacity:0]; #endif /* Create some configuration objects. */ NSURLSessionConfiguration *backgroundConfigObject = [NSURLSessionConfiguration backgroundSessionConfiguration: @"myBackgroundSessionIdentifier"]; NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSessionConfiguration *ephemeralConfigObject = [NSURLSessionConfiguration ephemeralSessionConfiguration]; /* Configure caching behavior for the default session.Note that iOS requires the cache path to be a path relative to the ~/Library/Caches directory, but OS X expects an absolute path.*/ #if TARGET_OS_IPHONE NSString *cachePath = @"/MyCacheDirectory"; NSArray *myPathList = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *myPath = [myPathList objectAtIndex:0]; NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier]; NSString *fullCachePath = [[myPath stringByAppendingPathComponent:bundleIdentifier] stringByAppendingPathComponent:cachePath]; NSLog(@"Cache path: %@\n", fullCachePath); #else NSString *cachePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"/nsurlsessiondemo.cache"]; NSLog(@"Cache path: %@\n", cachePath); #endif NSURLCache *myCache = [[NSURLCache alloc] initWithMemoryCapacity: 16384 diskCapacity: 268435456 diskPath: cachePath]; defaultConfigObject.URLCache = myCache; defaultConfigObject.requestCachePolicy = NSURLRequestUseProtocolCachePolicy; /* Create a session for each configurations. */ self.defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]]; self.backgroundSession = [NSURLSession sessionWithConfiguration: backgroundConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]]; self.ephemeralSession = [NSURLSession sessionWithConfiguration: ephemeralConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];
Listing 1-3 Creating a second session with the same configuration object ephemeralConfigObject.allowsCellularAccess = NO; // ... NSURLSession *ephemeralSessionWiFiOnly = [NSURLSession sessionWithConfiguration: ephemeralConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];
Listing 1-4 Requesting a resource using system-provided delegates NSURLSession *delegateFreeSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]]; [[delegateFreeSession dataTaskWithURL: [NSURL URLWithString: @"http://www.example.com/"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSLog(@"Got response %@ with error %@.\n", response, error); NSLog(@"DATA:\n%@\nEND DATA\n", [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]); }] resume];
Listing 1-5 shows how you create and start a data task. Data task example NSURL *url = [NSURL URLWithString: @"http://www.example.com/"]; NSURLSessionDataTask *dataTask = [self.defaultSession dataTaskWithURL: url]; [dataTask resume];
Listing 1-6 Download task example NSURL *url = [NSURL URLWithString: @"https://developer.apple.com/library/ios/documentation/Cocoa/Reference/" "Foundation/ObjC_classic/FoundationObjC.pdf"]; NSURLSessionDownloadTask *downloadTask = [self.backgroundSession downloadTaskWithURL: url]; [downloadTask resume]; Listing 1-7 Delegate methods for download tasks -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { NSLog(@"Session %@ download task %@ finished downloading to URL %@\n", session, downloadTask, location); #if 0 /* Workaround */ [self callCompletionHandlerForSession:session.configuration.identifier]; #endif #define READ_THE_FILE 0 #if READ_THE_FILE /* Open the newly downloaded file for reading. */ NSError *err = nil; NSFileHandle *fh = [NSFileHandle fileHandleForReadingFromURL:location error: &err]; /* Store this file handle somewhere, and read data from it. */ #else NSError *err = nil; NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *cacheDir = [[NSHomeDirectory() stringByAppendingPathComponent:@"Library"] stringByAppendingPathComponent:@"Caches"]; NSURL *cacheDirURL = [NSURL fileURLWithPath:cacheDir]; if ([fileManager moveItemAtURL:location toURL:cacheDirURL error: &err]) { /* Store some reference to the new URL */ } else { /* Handle the error. */ } #endif } -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { NSLog(@"Session %@ download task %@ wrote an additional %lld bytes (total %lld bytes) out of an expected %lld bytes.\n", session, downloadTask, bytesWritten, totalBytesWritten, totalBytesExpectedToWrite); } -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes { NSLog(@"Session %@ download task %@ resumed at offset %lld bytes out of an expected %lld bytes.\n", session, downloadTask, fileOffset, expectedTotalBytes); }
URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:
方法来获取上传进度信息.uploadTaskWithRequest:fromFile:
或者uploadTaskWithRequest:fromFile:completionHandler:方法来创建一个上传任务,以及提供一个文件路径来读取内容.NSURLAuthenticationMethodNTLM
, NSURLAuthenticationMethodNegotiate
, NSURLAuthenticationMethodClientCertificate
,
or NSURLAuthenticationMethodServerTrust
,会话对象调用会话代理方法URLSession:didReceiveChallenge:completionHandler:
.如果app没有提供会话代理,会话对象调用任务得代理方法 URLSession:task:didReceiveChallenge:completionHandler:
处理.URLSession:didReceiveChallenge:completionHandler:
不会被调用.Listing 1-8 Session delegate methods for iOS background downloads #if TARGET_OS_IPHONE -(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session { NSLog(@"Background URL session %@ finished events.\n", session); if (session.configuration.identifier) [self callCompletionHandlerForSession: session.configuration.identifier]; } - (void) addCompletionHandler: (CompletionHandlerType) handler forSession: (NSString *)identifier { if ([ self.completionHandlerDictionary objectForKey: identifier]) { NSLog(@"Error: Got multiple handlers for a single session identifier. This should not happen.\n"); } [ self.completionHandlerDictionary setObject:handler forKey: identifier]; } - (void) callCompletionHandlerForSession: (NSString *)identifier { CompletionHandlerType handler = [self.completionHandlerDictionary objectForKey: identifier]; if (handler) { [self.completionHandlerDictionary removeObjectForKey: identifier]; NSLog(@"Calling completion handler.\n"); handler(); } } #endif清单1-9示例了APP代理方法:
Listing 1-9 App delegate methods for iOS background downloads - (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler { NSURLSessionConfiguration *backgroundConfigObject = [NSURLSessionConfiguration backgroundSessionConfiguration: identifier]; NSURLSession *backgroundSession = [NSURLSession sessionWithConfiguration: backgroundConfigObject delegate: self.mySessionDelegate delegateQueue: [NSOperationQueue mainQueue]]; NSLog(@"Rejoining session %@\n", identifier); [ self.mySessionDelegate addCompletionHandler: completionHandler forSession: identifier]; }
标签:
原文地址:http://blog.csdn.net/longshihua/article/details/51272024