Sinch的demo中SINUIViewController有什么用?

What is the use of SINUIViewController in the demo for Sinch?

我是 Sinch 的新手。我刚刚下载了用于调用的演示文件,我只是好奇这个文件的作用。特别是文件下方的最后几行。在我看来,这个视图控制器涉及在调用结束和开始时显示适当的视图控制器,但我不确定。

谢谢!

#import "SINUIViewController.h"

#import <objc/runtime.h>

// used for associated object references to simulate property-like storage for
// this category
static char sin_deferredDismissalKey;

@implementation SINUIViewController

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  if ([self.view window] == nil) {
    _isAppearing = NO;
    _isDisappearing = NO;
  }
}

- (void)viewWillAppear:(BOOL)animated {
  _isAppearing = YES;
  [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  _isAppearing = NO;
  [self dismissIfNecessary];
}

- (void)viewWillDisappear:(BOOL)animated {
  _isDisappearing = YES;
  [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated {
  [super viewDidDisappear:animated];
  _isAppearing = NO;
}

#pragma mark - Dismissal

- (void)dismiss {
  if ([self isDisappearing]) {
    return;
  } else if ([self isAppearing]) {
    [self setShouldDeferredDismiss:YES];
    return;
  }
  [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)dismissIfNecessary {
  if ([self shouldDeferrDismiss]) {
    [self setShouldDeferredDismiss:NO];
    dispatch_async(dispatch_get_main_queue(), ^{
      [self dismiss];
    });
  }
}

- (BOOL)shouldDeferrDismiss {
  return [self sin_getAssociatedBOOLForKey:&sin_deferredDismissalKey];
}

- (void)setShouldDeferredDismiss:(BOOL)v {
  [self sin_setAssociatedBOOL:v forKey:&sin_deferredDismissalKey];
}

#pragma mark -

- (BOOL)sin_getAssociatedBOOLForKey:(const void *)key {
  NSNumber *v = (NSNumber *)objc_getAssociatedObject(self, key);
  return v ? [v boolValue] : NO;
}

- (void)sin_setAssociatedBOOL:(BOOL)v forKey:(const void *)key {
  objc_setAssociatedObject(self, key, [NSNumber numberWithBool:v], OBJC_ASSOCIATION_COPY);
}

@end

这个class只是一个基础-class帮手viewcontroller,帮助你更轻松地解散viewcontroller。一些 viewcontroller 将继承自此 class。

- (BOOL)sin_getAssociatedBOOLForKey:(const void *)key
- (void)sin_setAssociatedBOOL:(BOOL)v forKey:(const void *)key

上述这些方法使用一种称为Associated Object 的技术来避免声明属性。您可以在此处阅读有关 Associated Object 的更多信息 http://nshipster.com/associated-objects/