使用NSURLSession进行上传下载
1、下载天气预报数据。使用的是 forecast.io 的天气预报接口,须要自行设置 apiKey
// // RWWeatherViewController.m // TroutTrip // // Created by Charlie Fulton on 2/26/14. // Copyright (c) 2014 Ray Wenderlich Tutorials. All rights reserved. // #import "RWWeatherDataTaskViewController.h" #warning THIS IS WHERE YOU SET YOUR FORECAST.IO KEY // see https://developer.forecast.io/docs/v2 for details static NSString const *kApiKey = @"YOUR_API_KEY"; @interface RWWeatherDataTaskViewController () @property (nonatomic, strong) NSDictionary *weatherData; @property (weak, nonatomic) IBOutlet UILabel *currentConditionsLabel; @property (weak, nonatomic) IBOutlet UILabel *tempLabel; @property (weak, nonatomic) IBOutlet UITextView *summary; @end @implementation RWWeatherDataTaskViewController #pragma mark - Lifecycle - (void)viewDidLoad { [super viewDidLoad]; //1 NSString *dataUrl = [NSString stringWithFormat:@"https://api.forecast.io/forecast/%@/38.936320,-79.223550",kApiKey]; NSURL *url = [NSURL URLWithString:dataUrl]; // 2 NSURLSessionDataTask *downloadTask = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { // Check to make sure the server didn't respond with a "Not Authorized" if ([response respondsToSelector:@selector(statusCode)]) { if ([(NSHTTPURLResponse *) response statusCode] == 403) { dispatch_async(dispatch_get_main_queue(), ^{ // Remind the user to update the API Key UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"API Key Needed" message:@"Check the forecast.io API key in RWWeatherDataTaskViewController.m" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; return; }); } } // 4: Handle response here [self processResponseUsingData:data]; }]; // 3 [downloadTask setTaskDescription:@"weatherDownload"]; [downloadTask resume]; } #pragma mark - Private // Helper method, maybe just make it a category.. - (void)processResponseUsingData:(NSData*)data { NSError *parseJsonError = nil; NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&parseJsonError]; if (!parseJsonError) { NSLog(@"json data = %@", jsonDict); dispatch_async(dispatch_get_main_queue(), ^{ self.currentConditionsLabel.text = jsonDict[@"currently"][@"summary"]; self.tempLabel.text = [jsonDict[@"currently"][@"temperature"]stringValue]; self.summary.text = jsonDict[@"daily"][@"summary"]; }); } } @end
2、使用NSURLSession下载图片
// // RWLocationViewController.m // TroutTrip // // Created by Charlie Fulton on 2/28/14. // Copyright (c) 2014 Ray Wenderlich Tutorials. All rights reserved. // #import "RWLocationDownloadTaskViewController.h" @interface RWLocationDownloadTaskViewController () @property (weak, nonatomic) IBOutlet UIImageView *locationPhoto; @property (weak, nonatomic) IBOutlet UIView *pleaseWait; @end @implementation RWLocationDownloadTaskViewController - (void)viewDidLoad { [super viewDidLoad]; self.pleaseWait.hidden = NO; [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; // 1 NSURL *url = [NSURL URLWithString: @"http://upload.wikimedia.org/wikipedia/commons/7/7f/Williams_River-27527.jpg"]; // 2 NSURLSessionDownloadTask *downloadPhotoTask =[[NSURLSession sharedSession] downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) { [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; self.pleaseWait.hidden = YES; // 3 UIImage *downloadedImage = [UIImage imageWithData: [NSData dataWithContentsOfURL:location]]; // Handle the downloaded image // Save the image to your Photo Album UIImageWriteToSavedPhotosAlbum(downloadedImage, nil, nil, nil); dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"updating UIImageView"); self.locationPhoto.image = downloadedImage; }); }]; // 4 [downloadPhotoTask resume]; } @end
3、使用NSURLSession上传数据(相同须要自行设置 appid 和 apikey。详细參考代码中给出的链接)
// // RWStoryViewController.m // TroutTrip // // Created by Charlie Fulton on 2/26/14. // Copyright (c) 2014 Ray Wenderlich Tutorials. All rights reserved. // #import "RWStoryUploadTaskViewController.h" #warning THIS IS WHERE YOU SET YOUR PARSE.COM API KEYS // see : http://www.raywenderlich.com/19341/how-to-easily-create-a-web-backend-for-your-apps-with-parse // https://parse.com/tutorials static NSString const *kAppId = @"YOUR_APP_KEY"; static NSString const *kRestApiKey = @"YOUR_REST_API_KEY"; @interface RWStoryUploadTaskViewController () @property (weak, nonatomic) IBOutlet UITextField *story; @end @implementation RWStoryUploadTaskViewController #pragma mark Private - (IBAction)postStory:(id)sender { // 1 NSURL *url = [NSURL URLWithString:@"https://api.parse.com/1/classes/FishStory"]; NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; // Parse requires HTTP headers for authentication. Set them before creating your NSURLSession [config setHTTPAdditionalHeaders:@{@"X-Parse-Application-Id":kAppId, @"X-Parse-REST-API-Key":kRestApiKey, @"Content-Type": @"application/json"}]; NSURLSession *session = [NSURLSession sessionWithConfiguration:config]; // 2 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; request.HTTPMethod = @"POST"; // 3 NSDictionary *dictionary = @{@"story": self.story.text}; NSError *error = nil; NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:kNilOptions error:&error]; if (!error) { // 4 NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:data completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { // Check to make sure the server didn't respond with a "Not Authorized" if ([response respondsToSelector:@selector(statusCode)]) { if ([(NSHTTPURLResponse *) response statusCode] == 401) { dispatch_async(dispatch_get_main_queue(), ^{ // Remind the user to update the API Key UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"API Key Needed" message:@"Check the Parse App and Rest API keys in RWStoryUploadTaskViewController.m" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; return; }); } } if (!error) { // Data was created, we leave it to you to display all of those tall tales! dispatch_async(dispatch_get_main_queue(), ^{ self.story.text = @""; }); } else { NSLog(@"DOH"); } }]; // 5 [uploadTask resume]; } } @end
參考链接:http://www.raywenderlich.com/67081/cookbook-using-nsurlsession