【问题标题】:Common shared class for webservice callWeb服务调用的通用共享类
【发布时间】:2016-03-14 12:29:28
【问题描述】:

让我澄清一下我的问题。我想要一个通用的共享类来调用网络服务。我还想使用 Block 处理响应中的数据和错误。

我得到了答案。正如 Amin 所说,我可以制作如下共享实例:

+ (instancetype)sharedInstance
{
static NetworkManager *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    sharedInstance = [[NetworkManager alloc]init];
    NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
    session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:sharedInstance delegateQueue:nil];
});
return sharedInstance;
}

之后我可以定义如下方法:

-(void) fetchDataForURL : (NSString*)urlString postData:(NSDictionary*)dataDic WithCompletionBlock : (void(^) (NSDictionary *responseDictionary, NSError *error)) completionBlock
{
  // sending request here using NSURlConnection or NSURLSession

  // whatever data I get here I can get that data in the completionBlock declared in the method

        completionBlock(jsonDic, error);
}

现在,我可以使用共享实例在任何类中调用该方法。我也可以在完成块中获取数据。

希望我说得不太清楚。 谢谢大家的帮助。

【问题讨论】:

  • 什么问题...?你想要一个 NSURLSession 的示例代码吗?
  • 我认为要求是,一个模型类使用 NSURLSession 处理所有 Web 服务调用,对吧?

标签: ios design-patterns delegates singleton nsurlsession


【解决方案1】:

我很不确定,你也想做什么。基本上我理解你的 Q,你想在一个类NetworkManager 的共享实例中获得所有请求的响应?对吧?

首先,您应该重新考虑您的设计。 “合而为一”就像是一种全局 var 代码的味道。然而,……

A.创建网络管理器的共享实例。这是通常的模式:

@implemenation NetworkManager
…
+ (instancetype)sharedInstance
{
  static NetworkManager *sharedInstance = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, 
  ^{
    sharedInstance = [[NetworkManager alloc] init];
  });
  return sharedInstance;
}

B.在完成块中使用共享实例。例如:

[NSURLSession dataTaskWithURL:… completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error)
{
  NetworkManager *networkManager = [NetworkManager sharedInstance];
  [networkManager processData:data]; // Or whatever you want to do.
}

另外,将网络管理器设置为会话的代表可能很有用。

【讨论】:

  • 谢谢阿明。我只想要这个。我的另一个疑问是我将如何从另一个类的块中获取 data
  • 我再次不确定,你想做什么。但是,如果您想在许多类的许多实例中获取数据,首先这是一个好主意(阅读我的答案的介绍),其次只需在块中使用该实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
相关资源
最近更新 更多