循环测试变量

时间:2014-08-28 14:54:54

标签: ios objective-c ibeacon

我正在开发一个应用程序,我需要验证给定变量在给定时间内是否具有相同的值。我该怎么做?也许一个解决方案可以是使用一个线程并手动强制它来测试我的变量每100毫秒(相当于C函数“等待”或类似的东西)。这是对的吗?我认为(并希望)有一个更优雅的解决方案。

具体来说,我正在使用信标,我需要触发一个方法,当信标在我的设备上立即停留一段时间。

3 个答案:

答案 0 :(得分:0)

您可以使用键值观察。请参阅:AppleNSHipster

当值发生变化时,您会收到通知。

答案 1 :(得分:0)

您可以使用NSTimer来安排此测试。

或使用

- (void)observeValueForKeyPath:(NSString *)keyPath
                  ofObject:(id)object
                    change:(NSDictionary *)change
                   context:(void *)context

答案 2 :(得分:0)

当范围为CLBeacons时,无论如何都会从操作系统获得回调,因此将逻辑放入此回调方法可能更容易。像这样:

  NSMutableDictionary *immediateRangeBeaconTimes;
  ...

  - (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)iBeacons inRegion:(CLBeaconRegion *)region {
      NSDate *now = [NSDate new];
      for (CLBeacon *iBeacon in iBeacons) {
          NSString *key = [NSString stringWithFormat:@"%@ %@ %@", iBeacon.proximityUUID, iBeacon.major, iBeacon.minor];
          if ([immediateRangeBeaconTimes objectForKey:key] == Nil) {
              if (iBeacon.proximity == CLProximityImmediate) {
                  [immediateRangeBeaconTimes setObject: now forKey:key];
              }
          }
          else {
              if (iBeacon.proximity == CLProximityImmediate) {
                  if ([now timeIntervalSinceDate: [immediateRangeBeaconTimes objectForKey:key]] > 60) {
                      NSLog(@"This beacon has been immediate for 60 seconds.  Do something.");
                  }
              }
              else {
                  [immediateRangeBeaconTimes removeObjectForKey:key];
              }

          }

      }
  }

我意识到这并不是你所要求的,但是想要提供一个替代方案,以防它对你的用例更好。