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 constconst *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 constconst *kAppId = @"YOUR_APP_KEY";
- static NSString constconst *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