2017-06-05 43 views
2

目前我正在调用viewcontroller本身的API,但这不符合每个MVC的良好编程习惯。
这里是我的代码:我应该如何创建模型类来调用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

回答

1

斯威夫特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

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

你能在的ObjectiveC – sss

+0

建议好吧,我将转换成的ObjectiveC –

+0

能否请您解释我怎么能在我的viewController使用? – sss

相关问题