ios - 我应该如何创建模型类来调用 API(使用 MVC 模式)?

标签 ios objective-c model-view-controller

目前我在 viewcontroller 本身中调用 API,但这不是按照 MVC 的良好编程习惯。
这是我的代码:

-(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

最佳答案

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
    }
}

objective-c

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

#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)
        }
  }];

关于ios - 我应该如何创建模型类来调用 API(使用 MVC 模式)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44362906/

相关文章:

iphone - C++ 中的静态初始化与 Objective-C 混合

php - 为什么这么多 MVC Web 框架喜欢将多个 Controller 操作分组到一个类中?

php - 无法检索数据以使用 codeigniter 通过电子邮件发送

ios - 带有 NSFetchedResultController 的 TableView 在屏幕外显示损坏的单元格

objective-c - Storyboard : Open UIViewController from storyboard as popover from image in UITableViewCell

objective-c - 包含在多个类中时的 iOS 6 外观

python - django 中的自定义用户模型

ios - 从 ViewController 访问 View subview

ios - Sprite-kit:如何将 Sprite 定位在圆形路径上

ios - 带有 iCloud 过滤谓词的 MPMediaQuery playlistQuery 返回集合中不正确的项目数