Правильное использование: NSOperation и NSInvocationOperation
Я изучаю NSOperation и у меня есть сомнения относительно правильного способа реализации этого для моей ситуации.
В моем приложении я хочу выполнить много операций в фоновом режиме. Поскольку мое приложение может импортировать данные из настольного программного обеспечения, моя база данных может стать очень большой в зависимости от ситуации. При этом чтение и анализ данных могут занять несколько секунд, и я не хочу, чтобы мой пользовательский интерфейс был заморожен в течение этого времени.
Предположим, что у меня есть класс:
ClassX
- (void) heavyOp1
- (void) heavyOp2
- (void) heavyOp3
Каждый хэвиОп связан с ClassX
, поэтому имеет смысл, что они принадлежат к одному классу.
Мои вопросы и мои варианты:
1) должен ClassX
быть подклассом NSOperation
?
Я понимал, что операции должны представлять одну задачу, но мой класс предлагает 3 разные задачи. Я мог бы попытаться контролировать выполнение с помощью некоторых пользовательских конструкторов, но я думаю, что я, вероятно, нарушаю концепцию.
2) Использование NSInvocationOperation
верно? Я не могу отменить это!
Я знаю, что могу сделать что-то подобное:
ClassX *myClassX = [[ClassX alloc] init];
NSInvocationOperation *myOp = [[NSInvocationOperation alloc] initWithTarget:myClassX selector:@selector(heavyOp1) object:nil];
NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];
[myQueue myOp];
но если я позвоню [myQueue cancelAllOperations];
ClassX
не будет отвечать на self.isCancelled
потому что его нет в NSInvocationOperation
,
Заставить класс распознать код [myOp addObserver:myClassX forKeyPath:@"isCancelled" options:NSKeyValueObservingOptionNew context:nil];
работает, но опять же я думаю, что я нарушаю концепции.
3) Создать подкласс NSOperation
для каждого метода HeavyOp из моего ClassX
?
Это создаст много подклассов и может быть трудно управлять им, я не знаю, правильно ли это.
Итак, как правильно решить проблему? Кто-нибудь может дать мне совет? Возможно я ошибаюсь с одним из вариантов, которые я объяснил. Если что-то не понятно, просто спросите, и я постараюсь объяснить лучше.
1 ответ
Я склонен думать о NSInvocationOperation
используется для ретро-подгонки операций и очередей к существующему коду. Если бы я начинал с нуля, или даже если бы я хотел более детальный контроль (возможность отмены, как вы упоминаете), я бы определенно создал подкласс (ы) NSOperation
,
Не зная точно, каковы ваши тяжелые операции, трудно сказать с уверенностью, но я также был бы склонен создавать их как три отдельных класса. Отмена каждой операции может иметь разные вещи, которые необходимо сделать, поэтому ясно, что у вас есть код для выполнения этой отмены в отдельных классах.