Marcus Zarra's "Core Data" (2nd edition)本书列出了一个示例,在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’
现在我想知道我应该对这些警告做些什么
原子性属性怎么样?
尽管有警告,是否可以更改参数?
还有其他更好的解决方案,不涉及更改块参数吗?
答案 0 :(得分:2)
原子性属性怎么样?
从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)
。