我应该如何创建模型类来调用API(使用MVC模式)? [英] How should I create model class to call API (Using MVC pattern)?
本文介绍了我应该如何创建模型类来调用API(使用MVC模式)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
目前,我正在viewcontroller
本身中调用API,但这不是按照MVC的良好编程习惯.
这是我的代码:
Currently I am calling an API in viewcontroller
itself but this is not good programming practice as per MVC.
Here is my code:
-(void)fetchData{
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:@"https://dl.dropboxusercontent.com/s/2iodh4vg0eortkl/facts.json"]];
[request setHTTPMethod:@"GET"];
[request addValue:@"text/plain" forHTTPHeaderField:@"Content-Type"];
[request addValue:@"text/plain" forHTTPHeaderField:@"Accept"];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSString *requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSData * responseData = [requestReply dataUsingEncoding:NSUTF8StringEncoding];
if (responseData != nil) {
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
NSLog(@"requestReply: %@", jsonDict);
self.content = jsonDict[@"rows"];
self.navigationTitle = jsonDict[@"title"];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
NSLog(@"result %@", self.content);
}
}] resume];
}
您能否建议我应该如何按照MVC模式排列代码/文件?
如果创建单独的模型类,应该如何管理现有代码,以及如何将响应传输到viewcontroller
?
Can you please suggest how should I arrange code/file to follow MVC pattern?
If I create separate model class how should I manage existing code and how I transfer response to viewcontroller
?
推荐答案
Swift 3 试试这个:
class WebRequester: NSObject {
static let shared = WebRequester()
func request(vc:UIViewController, url: String, parameter:String?, callback:@escaping (_ result:NSDictionary?, _ error:NSError?) -> Void) {
let requestURL = url
print("..............................")
print("URL: ",requestURL)
print("Parameter: ",parameter ?? "nil")
print("..............................")
var request = URLRequest(url: URL(string:requestURL)!)
request.httpMethod = "POST"
if parameter != nil {
request.httpBody = parameter!.data(using: .utf8)
}
let session = URLSession.shared
let task = session.dataTask(with: request, completionHandler: {data, response, error in
UIApplication.shared.isNetworkActivityIndicatorVisible = false
DispatchQueue.main.async {
if error == nil {
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments)
print(json)
let dic = json as? NSDictionary
if dic != nil {
callback(json as? NSDictionary, nil)
}
else {
vc.alert(title: "Oops..", message: "Something went wrong please try again later")
}
}
catch {
print(error.localizedDescription)
callback(nil,error as NSError?)
}
}
else {
print(error?.localizedDescription ?? "")
callback(nil, error as NSError?)
}
}
})
task.resume()
UIApplication.shared.isNetworkActivityIndicatorVisible = true
}
}
ObjectiveC
WebRequester.h
WebRequester.h
#import <Foundation/Foundation.h>
@interface WebRequester : NSObject
+(id)shared;
-(void)request1:(NSString *)url parameter:(NSString *)params callback:(void(^)(NSDictionary *result, NSError *error))callback;
@end
WebRequester.m
WebRequester.m
#import "WebRequester.h"
@implementation WebRequester
+(id)shared {
static WebRequesterObjC *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
-(void)request1:(NSString *)url parameter:(NSString *)params callback:(void(^)(NSDictionary *result, NSError *error))callback {
NSString *requestUrl = url;
NSLog(@"====================");
NSLog(@"%@",requestUrl);
NSLog(@"%@",params);
NSLog(@"====================");
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:requestUrl]];
request.HTTPMethod = @"POST";
if (params != nil) {
request.HTTPBody = [params dataUsingEncoding:NSUTF8StringEncoding];
}
NSURLSession* session = [[NSURLSession alloc] init];
NSURLSessionDataTask* task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error == nil) {
if (data != nil) {
NSError * err;
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&err];
if (err == nil) {
callback(dic,nil);
}
else {
callback(nil,err);
}
}
}
else {
callback(nil,error);
}
}];
[task resume];
}
@end
通话如下
[WebRequesterObjC.shared request1:<#url#> parameter:params callback:^(NSDictionary *result, NSError *error) {
if (error == nil) {
NSLog(@"%@",result)
}
}];
这篇关于我应该如何创建模型类来调用API(使用MVC模式)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文