存储稍后在委托回调中返回的参数值

时间:2016-08-27 14:30:30

标签: objective-c algorithm

我有一个单例类和一个如下定义的协议。 (简化的)

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

我希望在不重构我的大部分代码的情况下获得优雅的问题解决方案。

1 个答案:

答案 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

对于其中任何一个选项,您的单身人士可以维护一个将呼叫映射到响应的集合。