首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调用在运行时获得的Objective块?

如何调用在运行时获得的Objective块?
EN

Stack Overflow用户
提问于 2015-12-22 12:10:30
回答 1查看 88关注 0票数 1

我正在尝试写一个HKHealthStore的嘲弄。在经过存根的executeQuery:中,我需要调用传递给它的HKSampleQuery实例的结果处理程序块。这个块是私有的,所以我需要在运行时得到它。到目前为止,这就是我所拥有的:

代码语言:javascript
复制
- (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”。

是否有任何方法使用适当的参数调用该块?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-22 21:39:59

你不是在做你认为你在做的事。您将得到方法resultHandler (属性resultHandler的getter方法)的实现。您想要的块是属性resultHandler的值,它是运行getter方法的返回值。换句话说,您需要运行getter并获得结果,而不是获取getter本身。

调用该方法并获取返回值的最简单方法(因为在本例中,返回值是一个常规对象指针类型)

代码语言:javascript
复制
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;一样直接访问该属性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34415652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档