BaseTask 是一套类,它使您能够轻松创建一个 web 服务的 API 客户端。它将样板代码简化到只需您与 API 交互所需的具体细节。
在构建与 web 服务交互的应用程序时,我希望利用 Apple 在 iOS 7 和 OS X 10.9 中引入的现有的 NSURLSession 类。我还希望有一个可以子类化的东西,这样我就可以将不同的 web 资源请求封装在具体的类中,只添加它们的特定细节。
// UserTask.swift
import BaseTask
class PostTask: BaseTask {
typealias Post = [String: AnyObject]
typealias GetPostCompletionHandler = (Post?, NSURLResponse?, NSError?) -> Void
typealias GetAllPostsCompletionHandler = ([Post]?, NSURLResponse?, NSError?) -> Void
let baseURLString = "http://jsonplaceholder.typicode.com/posts"
func getPost(id: String, completionHandler: GetPostCompletionHandler) -> NSURLSessionDataTask {
let url = NSURL(string: "\(baseURLString)/\(id)")!
return makeHTTPRequest(url,
bodyDictionary: nil,
httpMethod: .Get,
httpHeaders: nil,
bodyParser: nil,
responseParsers: [JSONResponseParser()],
completion: { (parsedObject, response, error) in
let objectToReturn = parsedObject as? Post
completionHandler(objectToReturn, response, error)
}
)
}
func getAllPosts(completionHandler: GetAllPostsCompletionHandler) -> NSURLSessionDataTask {
let url = NSURL(string: baseURLString)!
return makeHTTPRequest(url,
bodyDictionary: nil,
httpMethod: .Get,
httpHeaders: nil,
bodyParser: nil,
responseParsers: [JSONResponseParser()],
completion: { (parsedObject, response, error) in
let objectToReturn = parsedObject as? [Post]
completionHandler(objectToReturn, response, error)
})
}
}
// Elsewhere
let task = PostTask().getAllPosts() { posts, response, error in
if let posts = posts where error == nil {
// do something with posts
print(posts)
}
}
task.resume()
// PostTask.h
@import BaseTask;
typedef NSDictionary<NSString *, id> Post;
typedef void (^GetAllPostsCallback)(NSArray<Post *> * _Nullable posts, NSURLResponse * _Nullable response, NSError * _Nullable error);
@interface PostTask : BaseTaskObjC
- (NSString *)baseURL;
- (void)getAllPostsWithCompletionHandler:(GetAllPostsCallback)completionHandler;
@end
// PostTask.m
#import "PostTask.h"
@implementation PostTask
- (NSString *)baseURL
{
return @"http://jsonplaceholder.typicode.com/posts";
}
- (void)getAllPostsWithCompletionHandler:(GetAllPostsCallback)completionHandler
{
NSURL *url = [NSURL URLWithString:[self baseURL]];
return [self makeHTTPRequest:url
bodyDictionary:nil
httpMethod:GET
httpHeaders:nil
bodyParser:nil
responseParsers:@[[JSONResponseParser new]]
dispatch_queue:nil
completion:completionHandler];
}
@end
// Elsewhere
NSURLSessionDataTask *task = [[PostTask new]
getAllPostsWithCompletionHandler:^(NSArray<Post *> *posts, NSURLResponse *response, NSError *error) {
if (!error && posts) {
// do something with posts
NSLog(@"%@", posts);
}
}];
[task resume];