我正在尝试写一个HKHealthStore的嘲弄。在经过存根的executeQuery:中,我需要调用传递给它的HKSampleQuery实例的结果处理程序块。这个块是私有的,所以我需要在运行时得到它。到目前为止,这就是我所拥有的:
- (void)executeQuery:(HKQuery *)query {
NSAssert([query isKindOfClass:HKSampleQuery.class], @"Mock executeQuery: not implemented yet for other query types than HKSampleQuery");
HKSampleQuery *sampleQuery = (HKSampleQuery *)query;
NSMutableArray<HKObject *> *queryResults = [NSMutableArray new];
for (HKObject *o in self.storedObjects) {
if ([sampleQuery.predicate evaluateWithObject:o]) {
[queryResults addObject:o];
}
}
SEL selector = NSSelectorFromString(@"resultHandler");
Method m = class_getInstanceMethod(HKSampleQuery.class, selector);
IMP imp = method_getImplementation(m);
typedef void(*resultHandler_t)(id, SEL, void(^)(HKQuery*, NSArray*, NSError*));
resultHandler_t f = (resultHandler_t)imp;
// here, I need to invoke the result handler block with sampleQuery, queryResults and nil as arguments
}注意,选择器名称是"resultHandler“,尽管HKSampleQuery初始化器的参数称为"resultsHandler”。
是否有任何方法使用适当的参数调用该块?
发布于 2015-12-22 21:39:59
你不是在做你认为你在做的事。您将得到方法resultHandler (属性resultHandler的getter方法)的实现。您想要的块是属性resultHandler的值,它是运行getter方法的返回值。换句话说,您需要运行getter并获得结果,而不是获取getter本身。
调用该方法并获取返回值的最简单方法(因为在本例中,返回值是一个常规对象指针类型)
typedef void (^resultHandler_t)(HKSampleQuery *query, NSArray *results, NSError *error);
resultHandler_t f = [sampleQuery performSelector:@selector(resultHandler)];
f(sampleQuery, queryResults, nil);或者,如果在虚拟的resultHandler类别中声明(但不是实现)实例方法或属性HKSampleQuery,则可以像resultHandler_t f = sampleQuery.resultHandler;一样直接访问该属性。
https://stackoverflow.com/questions/34415652
复制相似问题