AFHTTPSessionManager 委托问题
AFHTTPSessionManager Delegate issue
这是我的问题:
我有一个 AFHTTPSessionManager
文件,它也是一个单例,并管理我对服务器的所有 API 请求。一旦我用 responseObject
从服务器得到答案,我就将它传回给使用委托请求它的 UIViewController
。
我的问题是:由于我的经理是单身人士,如果另一个 API 请求同时由另一个 UIViewController
发出,委托将设置到此控制器,并且当我的第一个请求 responseObject
已收到我无法再将其传回第一个 UIViewController
。
我希望它很容易理解。
解决这个问题的正确方法是什么?
这是我的 AFHTTPSessionManager
class 中的方法:
- (void)getStaffForCompany:(int)companyID
{
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"currentUser"])
{
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
parameters[@"apiKey"] = agendizeApiKey;
parameters[@"token"] = [[AGZUserManager sharedAGZUser] currentApplicationUser].token;
[self GET:[NSString stringWithFormat:@"scheduling/companies/%d/staff", companyID] parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
if ([self.delegate respondsToSelector:@selector(AGZClient:successedReceiveStaffList:)]) {
[self.delegate AGZClient:self successedReceiveStaffList:responseObject];
}
} failure:^(NSURLSessionDataTask *task, NSError *error) {
if ([self.delegate respondsToSelector:@selector(AGZClient:failedReceiveStaffList:)]) {
[self.delegate AGZClient:self failedReceiveStaffList:error];
}
}];
}
}
谢谢!
您可以定义自己的完成块并将您的 responseObject 传回控制器,这里是一个示例 CustomCompletion
。
将此添加到您的 AFHTTPSessionManager.h
@implementation
行上方。
typedef void(^CustomCompletion)(id responseObject);
更新您的方法以包含 CustomCompletion
对象。
- (void)getStaffForCompany:(int)companyID withCompletion:(CustomCompletion)completion {
// On success pass the responseObject back like so.
completion(responseObject);
}
然后 where all the magic happens
,回到你的控制器中,在你的单例上调用这个方法并处理完成。
[SingletonManager getStaffForCompany:1 withCompletion:^(id responseObject) {
if (responseObject) {
// do something with this object
}
}];
我还没有测试过这段代码,但我在 Swift
中做了一些非常相似的事情,而且效果很好。
这是我的问题:
我有一个 AFHTTPSessionManager
文件,它也是一个单例,并管理我对服务器的所有 API 请求。一旦我用 responseObject
从服务器得到答案,我就将它传回给使用委托请求它的 UIViewController
。
我的问题是:由于我的经理是单身人士,如果另一个 API 请求同时由另一个 UIViewController
发出,委托将设置到此控制器,并且当我的第一个请求 responseObject
已收到我无法再将其传回第一个 UIViewController
。
我希望它很容易理解。
解决这个问题的正确方法是什么?
这是我的 AFHTTPSessionManager
class 中的方法:
- (void)getStaffForCompany:(int)companyID
{
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"currentUser"])
{
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
parameters[@"apiKey"] = agendizeApiKey;
parameters[@"token"] = [[AGZUserManager sharedAGZUser] currentApplicationUser].token;
[self GET:[NSString stringWithFormat:@"scheduling/companies/%d/staff", companyID] parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
if ([self.delegate respondsToSelector:@selector(AGZClient:successedReceiveStaffList:)]) {
[self.delegate AGZClient:self successedReceiveStaffList:responseObject];
}
} failure:^(NSURLSessionDataTask *task, NSError *error) {
if ([self.delegate respondsToSelector:@selector(AGZClient:failedReceiveStaffList:)]) {
[self.delegate AGZClient:self failedReceiveStaffList:error];
}
}];
}
}
谢谢!
您可以定义自己的完成块并将您的 responseObject 传回控制器,这里是一个示例 CustomCompletion
。
将此添加到您的 AFHTTPSessionManager.h
@implementation
行上方。
typedef void(^CustomCompletion)(id responseObject);
更新您的方法以包含 CustomCompletion
对象。
- (void)getStaffForCompany:(int)companyID withCompletion:(CustomCompletion)completion {
// On success pass the responseObject back like so.
completion(responseObject);
}
然后 where all the magic happens
,回到你的控制器中,在你的单例上调用这个方法并处理完成。
[SingletonManager getStaffForCompany:1 withCompletion:^(id responseObject) {
if (responseObject) {
// do something with this object
}
}];
我还没有测试过这段代码,但我在 Swift
中做了一些非常相似的事情,而且效果很好。