导航到包含ScrollView的ViewController速度太慢

3
这是我从A视图控制器推到B视图控制器的方法。
UIStoryboard *mainStory = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ListingViewController *listView = [mainStory instantiateViewControllerWithIdentifier:@"listing"];

[self.navigationController pushViewController:listView animated:YES];

我也尝试过在 Storyboard 中使用 segue 的方式

[self performSegueWithIdentifier:@"Associate3" sender:sender];

第一次将视图控制器推送到前台时会在开始推送前冻结(约4秒),请注意VC B包含其XIB中的UIScrollView对象。这种情况是否发生在你们身上?有人知道如何解决这个延迟吗?
编辑:我已经注释掉了所有的webservice调用方法,但没有改变!我认为这是一个分配延迟,我正在使用故事板通过标识符初始化VC B,但是当我使用分配方法:VC *B = [[VC alloc] init],然后推送此视图就可以无延迟工作,但问题是我不需要使用分配方法!!

1
你在 ViewController B 中调用了任何 Web 服务吗? - Dharmbir Singh
是的,我在视图加载后调用了httprequest来读取JSON。 - samir
分享viewDidLoad ViewController B的代码。 - Aamir
但是当我推送到其他不包含ScrollView的视图(HttpRequest)时,我做的事情是一样的,它可以正常推送,除了这个在IB中有ScrollView的视图!! - samir
不幸的是,我已经尝试过了,但结果相同,正如我所说,我确信这与在VC B的IB中添加的ScrollView有关。 - samir
显示剩余5条评论
5个回答

2

最终找到了问题所在,是VC B标签中使用的自定义字体造成的。将它们设置回系统字体而不是Roboto就解决了我的问题。我认为系统需要一些时间来查找具有特定名称的字体。希望这对其他人有用。


0
这可能是因为推送是在不同的线程中执行的。尝试在主线程中推送viewController。即,用以下代码替换您的push controller代码:
dispatch_async(dispatch_get_main_queue(), ^{
    UIStoryboard *mainStory = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    ListingViewController *listView = [mainStory instantiateViewControllerWithIdentifier:@"listing"];

    [self.navigationController pushViewController:listView animated:YES];
});

0
尝试在ListingViewController类的viewDidLoad方法中更改为调用异步。
- (void)viewDidLoad {
  [super viewDidLoad];

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
  //move your code here
  // if you need to do something on ui (reload table view e.t.c) - call async in main thread
    dispatch_async(dispatch_get_main_queue(), ^{
      //Your UI code
    });
  });
}

相同的结果,没有任何改变,它应该在点击按钮后直接执行一个操作,但是在执行此操作之前会冻结大约3秒钟!!! - samir
你在viewWillDisappear里面有什么东西吗? - Sandr
最好能够展示你调用 Web 服务的代码。 - Sandr
亲爱的,我已经注释了所有的Web服务调用方法,没有任何改变!我认为这是一个分配延迟,我正在使用带有标识符的Storyboard初始化来推送VC B,但是当我使用分配方法:VC *B = [[VC alloc] init],然后将其推送到这个视图时,它可以在没有延迟的情况下工作,但问题是我不需要使用分配方法!! - samir

0

看起来你正在ViewController BViewWillAppearViewDidLoad方法中在主线程上执行一些重操作。

请注释掉上述两个方法的整个代码,然后运行应用程序以验证问题。

如果验证成功,则必须将重操作从主线程移动到后台线程


尝试这样做,结果相同,我确定问题出在我在VC B的IB中添加的ScrollView对象。 - samir
好的,那么请从IB中删除ScrollView,然后分享你的结果。 - Aamir
再次,什么都没变...这让我疯了!! - samir
好的,它显示ScrollView与此无关,现在请删除所有项目并尝试在其中使用单个UILabel。 - Aamir
只在IB中留下标签,它需要相同的时间! - samir
使用@property (strong, nonatomic)实例是否与此问题有关? - samir

0
你可以使用 Xcode 中的“Instruments-Time Profiler”开发者工具来检查时间开销。然后,我认为你会找到问题所在。

我不认为我能够理解它的结果,如果您有任何快速教程,那将是非常好的。 - samir
  1. 打开 Xcode。
  2. 选择 Xcode > 打开开发工具 > Instruments。
  3. 打开时间分析器。
- Peike Luo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接