在使用不同实例(RestKit)的方法调用期间冲突 SharedInstance

Posted

技术标签:

【中文标题】在使用不同实例(RestKit)的方法调用期间冲突 SharedInstance【英文标题】:Conflicting SharedInstance during method call with different instance (RestKit) 【发布时间】:2015-08-28 06:27:42 【问题描述】:

我正在为 RESTFUL Web 服务使用 Restkit 框架。

我的资源管理器,即 TaskManager 和 TaskDashboardCountManager 发生冲突。 当我调用方法时

 [[TaskDashboardCountManager sharedManager] loadTaskCount:^(NSDictionary *task) ];

我遇到了异常

'NSInvalidArgumentException',原因:'-[TaskDashboardCountManager loadTask:failure:]:

loadTask 是 TaskManager 的方法,但它是使用 TaskDashboardCountManger 调用的。我该如何解决这个问题?

 **RKObjectManager.h**
          @interface AKObjectManager : RKObjectManager

            + (instancetype) sharedManager;

            - (void) setupRequestDescriptors;
            - (void) setupResponseDescriptors;

            @end

    **RKObjectManager.m**
    static AKObjectManager *sharedManager = nil;

    @implementation AKObjectManager

    + (instancetype)sharedManager 
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^
            NSURL *url = [NSURL URLWithString:BASE_DEVELOPMENT_URL];

            sharedManager = [self managerWithBaseURL:url];

            sharedManager.requestSerializationMIMEType = RKMIMETypeJSON;
            /*
             THIS CLASS IS MAIN POINT FOR CUSTOMIZATION:
             - setup HTTP headers that should exist on all HTTP Requests
             - override methods in this class to change default behavior for all HTTP Requests
             - define methods that should be available across all object managers
             */

            [sharedManager setupRequestDescriptors];
            [sharedManager setupResponseDescriptors];

            AppDelegate *delegate=(AppDelegate *)[[UIApplication sharedApplication] delegate];
            [sharedManager.HTTPClient setDefaultHeader:@"Authorization" value: [NSString stringWithFormat:@"token %@", delegate.key]];


        );

        return sharedManager;
    

    - (void) setupRequestDescriptors 
    

    - (void) setupResponseDescriptors 
    


    **TaskManager.m**
    @implementation TaskManager

    + (id)sharedInstance 
        static TaskManager *__sharedInstance=nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^
            __sharedInstance = [[self alloc] init];

            [__sharedInstance setupResponseDescriptors];
        );

        return __sharedInstance;
    



    - (void) loadTask:(void (^)(NSArray *task))success failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure

        );


    **#import "TaskDashboardCountManager.h"**

        static TaskDashboardCountManager *sharedManager = nil;

        @implementation TaskDashboardCountManager

        + (id)sharedInstance 
            static TaskDashboardCountManager *__sharedInstance=nil;
            static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^
                __sharedInstance = [[self alloc] init];

                [__sharedInstance setupResponseDescriptors];
            );

            return __sharedInstance;
        

        - (void) loadTaskCount:(void (^)(NSDictionary *task))success failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure
        );

【问题讨论】:

它们是什么的子类? RestKit 已经提供了一个共享实例,所以你可能会碰撞类方法 @interface TaskManager : AKObjectManager restkit-tutorials.com/code-organization-in-restkit-based-app - 我正在根据本教程进行编码。当我调用 [[TaskDashboardCountManager sharedManager] loadTaskCount:^(NSDictionary *task) ];这将执行得很好,但是当我调用 [[TaskManager sharedManager] 加载任务 ];在这里我得到了例外。 sharedManager 持有 TaskDashboardCountManger 的实例。 【参考方案1】:

您似乎混淆了sharedInstancesharedManager。将有 1 个 sharedManager 将是第一个创建的,然后,任何其他对 sharedManager 的引用,无论它来自哪个类,都将返回相同的实例。

至少你需要清理它。目前还不清楚为什么AKObjectManager 有一个sharedManager 方法,如果它是子类,那么超类不能实例化是合乎逻辑的......

你最好不要尝试如此普遍地使用单例,而是显式地创建实例并使用依赖注入。

【讨论】:

我会发给你同样的演示项目,你能帮帮我吗? dropbox.com/s/8nbykv1nfk12u4h/AKGithubClient-master.zip?dl=0 1.允许您将所需的 HTTP 标头设置在一个地方(在 AKObjectManager 中执行一次)2.更易于扩展。例如,如果您想为所有 HTTP 请求自定义默认行为,您可以覆盖 AKObjectManager 中的方法。结构更灵活

以上是关于在使用不同实例(RestKit)的方法调用期间冲突 SharedInstance的主要内容,如果未能解决你的问题,请参考以下文章

不同的 web 服务调用不同的视图控制器 Restkit

需要使用 RestKit 创建多个相同的实体

RestKit 在 RKManagedObjectRequestOperation objc_msgSend 期间崩溃

使用 Restkit 监控网络调用 IOS

Shein笔试

Shein笔试