2015-08-28 3 views
0

Я использую среду Restkit для веб-службы RESTFUL.Конфликт SharedInstance во время вызова метода с другим экземпляром (RestKit)

My Resoucemanager i, e TaskManager и TaskDashboardCountManager конфликтуют. Когда я вызываю метод

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

Я получаю исключение

'NSInvalidArgumentException', причина: «- [TaskDashboardCountManager loadTask: провал]:

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{ 
     }); 
+0

Что они представляют собой подклассы? RestKit уже предлагает общий экземпляр, чтобы вы могли сталкиваться с методами класса – Wain

+0

@interface TaskManager: AKObjectManager –

+0

http://restkit-tutorials.com/code-organization-in-restkit-based-app/ - Я кодирую в соответствии с этим руководство . когда я вызываю [[TaskDashboardCountManager sharedManager] loadTaskCount:^(задача NSDictionary *) { }]; это будет выполняться нормально, но когда я вызываю задачу [[TaskManager sharedManager] load} {}]; Здесь я получаю исключение. sharedManager содержит экземпляр TaskDashboardCountManger. –

ответ

0

Вы кажетесь смешались sharedInstance и sharedManager. Будет 1 sharedManager, который будет первым, созданным, то любая другая ссылка на sharedManager независимо от того, какой класс он из будет возвращать тот же экземпляр.

Как минимум вам нужно очистить это. Это не совсем понятно, почему AKObjectManager имеет метод sharedManager, если это подклассы, то это логично суперкласс не будет инстанциируемым ...

Ты лучше не пытаться использовать одиночка так pervasively и вместо того, чтобы создать экземпляры явно и использовать инъекцию зависимостей.

+0

Я посылаю вам тот же демонстрационный проект, пожалуйста, помогите мне? https://www.dropbox.com/s/8nbykv1nfk12u4h/AKGithubClient-master.zip?dl=0 –

+0

1. позволяет вам поддерживать требуемые HTTP-заголовки в одном месте (сделать это один раз в AKObjectManager) 2.easier to расширить. Например, если вы хотите настраивать поведение по умолчанию для всех ваших HTTP-запросов, вы переопределяете методы в AKObjectManager. более гибкая структура –

 Смежные вопросы

  • Нет связанных вопросов^_^