0

我不明白 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 之前被调用。

我应该谷歌搜索任何词吗?

4

1 回答 1

0

有什么词我应该用谷歌搜索吗?

您可以从以下开始:异步设计、块、GCD/Grand Central Dispatch 也应该有所帮助——您没有使用它,但异步设计经常使用。

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

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

您的包含调用的方法initWithSampleType:不能allBeckuped同步返回结果(例如您的)。因此它需要一个“结果处理程序”块参数,并且您传递给initWithSampleType:的块应该调用传递给您的方法的块 - 因此编织了异步控制流。

高温高压

于 2015-12-07T21:14:45.753 回答