Можно ли переопределить свойство completeBlock NSOperation с различными типами параметров?
В книге "Основные данные" (2-е издание) Маркуса Зарры приведен пример, в котором NSOperation
подкласс он отменяет completionBlock
имущество:
@property (copy) void (^completionBlock)(void) NS_AVAILABLE(10_6, 4_0);
с
typedef void (^ExportCompletionBlock)(NSData *jsonData, NSError *error);
@property (nonatomic, copy) ExportCompletionBlock completionBlock;
который в Xcode 6 под 10.10 приводит к следующим предупреждениям:
‘atomic’ attribute on property ‘completionBlock’ does not match the property inherited from ‘NSOperation’
а также
Property type ‘ExportCompletionBlock’ (aka ‘void(^)(NSData *_strong, NSError *_strong)’) is incompatible with type ‘void(^)(void)’ inherited from ‘NSOperation’
Теперь мне интересно, что я должен сделать из этих предупреждений.
Как насчет атрибута атомарности?
Можно ли менять параметры, несмотря на предупреждение?
Есть ли другое, лучшее решение, которое не включает изменение параметров блока?
1 ответ
Как насчет атрибута атомарности?
Исходя из atomic
в nonatomic
действительно сбивает с толку. NSOperation - это то место, где необходимы атомные свойства. Если у вас нет очень веских причин, я бы придерживался atomic
,
Можно ли менять параметры, несмотря на предупреждение?
Предупреждение там по причине. completionBlock
ожидается, что свойство будет работать определенным образом, если оно каким-то образом вызывается с его оригинальной подписью (self.completionBlock()
) вместо переопределенной подписи (self.completionBlock(jsonData, error)
), тогда ваше приложение будет зависать.
Есть ли другое, лучшее решение, которое не включает изменение параметров блока?
Не переопределять completionBlock
, Вы не обязаны использовать completionBlock
создайте новое свойство с другим именем. Например, в вашем подклассе вы можете использовать exportCompletionBlock
:
@property (atomic, copy) ExportCompletionBlock exportCompletionBlock;
Затем в -main
, вызов self.exportCompletionBlock(jsonData, error)
когда операция закончилась вместо self.completionBlock(jsonData, error)
,