【问题标题】:Xcode cancel ViewDidAppearXcode 取消 ViewDidAppear
【发布时间】:2014-05-11 20:26:31
【问题描述】:

你们中有人知道是否可以取消viewDidAppear吗?

当我加载新视图时,viewDidAppear 正在加载,此时我无法切换视图。

这是viewDidAppear 代码:

- (void)viewDidAppear:(BOOL)animated{
    NSURL * imageURL = [NSURL URLWithString:[NSString stringWithFormat:@"Url",Username]];
    NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
    UIImage * image = [UIImage imageWithData:imageData];
    if (image) {
        UsersProfilpic.image = image;
    }

    imageURL = [NSURL URLWithString:[NSString stringWithFormat:@"Url",FriendsName]];
    imageData = [NSData dataWithContentsOfURL:imageURL];
    image = [UIImage imageWithData:imageData];
    if (image) {
        FriendsProfilpic.image = image;
    }
}

提前致谢。 :)

【问题讨论】:

  • 无法取消 viewDidAppear:。但是,您可以选择不实施它。在您的情况下,问题是从网络同步加载图像数据。您应该考虑异步方法 - 那里有很多指南......
  • AFNetworking 为您的问题提供了一个简单而好的解决方案。检查this answer。如果图像已经加载,您可能只想添加一个检查而不加载图像。

标签: ios objective-c


【解决方案1】:

虽然从技术上讲,您可以从 viewDidAppear 中返回,但这有点疯狂,您一开始就不需要这样做。如果该方法中的某些东西使事情变慢,那么它不适合这样做。

例如,如果您要从某个远程源(例如 Web 服务器)加载个人资料图片,那么您很可能会从 viewDidAppear 中触发,但是获取数据应该异步进行。

与您的问题无关,但很重要:您错过了对 super:[super viewDidAppear:animated]; 的呼叫

【讨论】:

    【解决方案2】:

    记得打电话:

    [super viewDidAppear:animated]
    

    否则你不会调用UIViewController类的viewDidAppear方法。

    扩展类时,这一点非常重要。 记得调用 super 来维护你正在扩展的类的行为

    【讨论】:

      【解决方案3】:

      你永远不应该用网络调用阻塞 UI 线程。 了解 GCD。

      在 ViewDidLoad 中执行,viewDidAppear 也会在模态框被关闭时被调用,你不想每次模态框被关闭时都下载图像

      - (void)viewDidLoad
      {
         [super viewDidLoad];
      
          // Call it in global queue
          dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
              NSURL * imageURL = [NSURL URLWithString:[NSString stringWithFormat:@"Url",Username]];
              NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
              UIImage * image = [UIImage imageWithData:imageData];
              if (image) {
                  // Update image on ui thread
                  dispatch_async(dispatch_get_main_queue(), ^{
                      UsersProfilpic.image = image;
                  });
              }
          });
      
         // Call it in global queue
          dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
              imageURL = [NSURL URLWithString:[NSString stringWithFormat:@"Url",FriendsName]];
              imageData = [NSData dataWithContentsOfURL:imageURL];
              image = [UIImage imageWithData:imageData];
              if (image) {
      
                  // Update image on ui thread
                  dispatch_async(dispatch_get_main_queue(), ^{
                      FriendsProfilpic.image = image;
                  });
              }
          });
      }
      

      哦,变量名也不应该大写。使用骆驼记法

      【讨论】:

      • 如果您有 2 个不同的 dispatch_async 进行一些更改,这两个图像将被异步下载,从而为您提供更好的性能
      • 谢谢 :) 帮助很大 ;)
      【解决方案4】:

      您可以只包围 if(boolean) 中包含的所有代码,然后根据您是否要在 viewDidAppear 中执行代码来设置此布尔值。即

      - (void)viewDidAppear:(BOOL)animated{
          if (someBoolean == true) {
              NSURL * imageURL = [NSURL URLWithString:[NSString stringWithFormat:@"Url",Username]];
              NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
              UIImage * image = [UIImage imageWithData:imageData];
              if (image) {
                  UsersProfilpic.image = image;
              }
      
              imageURL = [NSURL URLWithString:[NSString stringWithFormat:@"Url",FriendsName]];
              imageData = [NSData dataWithContentsOfURL:imageURL];
              image = [UIImage imageWithData:imageData];
              if (image) {
                  FriendsProfilpic.image = image;
              }
          }
      }
      

      【讨论】:

        【解决方案5】:

        我不确定你到底想要什么。但是如果你想摆脱 "Loading" viewDidAppear,那么只需将那个 "viewDidAppear 代码" 放入 "viewDidLoad 方法"。 "viewDidLoad method" 在您到达特定的 viewController 时仅调用一次,但另一方面 "viewDidAppear method" 在您到达时每次都会调用到那个viewController。所以你的代码会是这样的:

        - (void)viewDidLoad
        {
            [super viewDidLoad];
        NSURL * imageURL = [NSURL URLWithString:[NSString stringWithFormat:@"Url",Username]];
            NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
            UIImage * image = [UIImage imageWithData:imageData];
            if (image) {
                UsersProfilpic.image = image;
            }
        
            imageURL = [NSURL URLWithString:[NSString stringWithFormat:@"Url",FriendsName]];
            imageData = [NSData dataWithContentsOfURL:imageURL];
            image = [UIImage imageWithData:imageData];
            if (image) {
                FriendsProfilpic.image = image;
            }
        }
        

        你也可以看看“This Discussion”。希望对您有所帮助。

        【讨论】:

          猜你喜欢
          • 2014-05-26
          • 1970-01-01
          • 1970-01-01
          • 2019-02-09
          • 1970-01-01
          • 1970-01-01
          • 2012-06-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多