我有一个单例类和一个如下定义的协议。 (简化的)
@protocol ClassADelegate <NSObject>
- (void) classADelegateDidFinishSomething:(BOOL) aBool;
@end
@interface ClassA : NSObject
@property (nonatomic, weak) id<ClassADelegate> delegate;
+ (ClassA *) shared;
- (void) methodA:(BOOL) aBool;
@end
methodA
方法在内部导致一串异步回调,最后在私有方法中需要调用委托方法,如下所示。
if (self.delegate)
{
[self.delegate classADelegateDidFinishSomething:BOOL_FROM_methodA];
}
上述方法中的BOOL_FROM_methodA
必须与aBool
方法中的methodA
相同。所以我必须在某处存储aBool
的值。假设我将它存储在私有变量_aBool
中,如下所示,稍后使用它来调用委托方法。
- (void) classMethodA:(BOOL) aBool
{
_aBool = aBool;
...
}
- (void) aPrivateMethod
{
....
if (self.delegate)
{
[self.delegate classADelegateDidFinishSomething:_aBool];
}
}
如果确保在调用委托方法之前没有进一步调用classMethodA
,则解决了这个问题。但想象一下以下情况。
[[ClassA shared] methodA:YES];
[[ClassA shared] methodA:NO];
对于上述代码,即使第一个classADelegateDidFinishSomething
调用NO
作为参数,methodA
个回调都会以YES
作为参数值。< / p>
我希望在不重构我的大部分代码的情况下获得优雅的问题解决方案。
答案 0 :(得分:2)
您正在使用本质上是一对一的结构(单例,委托)来实现需要上下文(多个请求)的内容。这不是一个很好的匹配。
我们想到的选项是每次调用 myApp.controller('myCtrl', ['$scope', 'fileUpload', function($scope, fileUpload){ //uploadFile function
$scope.uploadFile = function(){
var file = $scope.myFile;
console.log('file is ' );
console.dir(file);
var uploadUrl = "/fileUpload";
fileUpload.uploadFileToUrl(file, uploadUrl);
};
}]);
时使用ClassA
的唯一实例,或重写methodA
方法,以便调用者提供自己的上下文。
例如:
ClassA
这样,您可以将每个调用映射到创建它的对象。
或者,如果只有一个委托进行多次调用,请将- (void)classMethodA:(BOOL)aBool listener:(id<ClassADelegate>)listener;
对象替换为可用于标记呼叫的任何listener
参数。
context
对于其中任何一个选项,您的单身人士可以维护一个将呼叫映射到响应的集合。