我应该如何创建模型类来调用API(使用MVC模式)? [英] How should I create model class to call API (Using MVC pattern)?

查看:77
本文介绍了我应该如何创建模型类来调用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆