随着时间的推移执行功能和块

时间:2015-12-07 20:29:25

标签: ios objective-c health-kit hksamplequery

我不了解Objective-C循环系统的工作原理。我有从Health Kit执行查询的函数(希望名称是正确的,而不是检入代码)。当我在查询完成之前意识到函数传递返回值时,我的思绪被打破了。

__block bool allBeckuped = true;
HKSampleQuery *mySampleQuery = [[HKSampleQuery alloc] initWithSampleType:mySampleType
                                       predicate:myPredicate
                                           limit:HKObjectQueryNoLimit
                                 sortDescriptors:@[mySortDescriptor]
                                  resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error) {
                                      if(!error && results)
                                      {
                                          for(HKQuantitySample *samples in results)///main hk loop
                                          {
                                              allBeckuped = false;

                                              NSLog(@"1");
                                          }
                                      }
                                  }];//end of query

[healthStore executeQuery:mySampleQuery];
 NSLog(@"2");
return allBeckuped;

我试图检查是否有新数据,但我不知道在哪里放置条件,因为nslog2在nslog 1之前被调用。

我应该谷歌吗?

1 个答案:

答案 0 :(得分:0)

  

我应该谷歌吗?

您可以从以下开始:异步设计,块,GCD / Grand Central Dispatch也应该有所帮助 - 您不会使用它,但异步设计通常会这样做。

查看您正在调用的initWithSampleType:方法,它是遵循异步模型的方法的示例。您可能习惯使用同步模型,而不是立即返回结果,而是它的最后一个参数resultsHandler:,是该方法在将来某个时间调用的块< / em>将其操作结果传递给它。

这是您需要学习和遵循的模式。

包含对initWithSampleType:的调用的方法无法同步返回结果(例如您的allBeckuped)。所以它需要采用一个&#34;结果处理程序&#34;阻止参数,传递给initWithSampleType:的块应调用传递给您方法的块 - 因此编译异步控制流。

HTH