【问题标题】:Cancel background request for view when disappear消失时取消后台查看请求
【发布时间】:2014-03-31 09:39:02
【问题描述】:

我有一些在后台加载图像的视图

[self performSelectorInBackground:@selector(loadImages:) withObject:nil];

问题是,如果我在方法处理过程中取消了这个view,当它完成时,它会尝试重新加载一个不存在的UITableView

取消视图时是否应该取消后台请求?我该怎么做?

如果我在table 上检查nil,即使我在另一个页面中,它仍然会显示指向表格的指针。

【问题讨论】:

  • 用户 despatch_que,然后在另一个线程中运行

标签: objective-c multithreading performselector


【解决方案1】:

您不应该使用performSelectorInBackground:withObject:,因为最好使用NSOperationQueue 以及它(和NSOperation)为取消活动提供的支持。然后,当视图被隐藏时,只需调用[operationQueue cancelAllOperations]

(你显然需要写操作来考虑它是否已经被取消了......)

也就是说,无论loadImages: 在后台做什么,仍然可以通过在控制器尝试使用结果之前检查控制器的状态来取消它。您尚未显示方法内容,但这可能是检查控制器上的 BOOL(例如 isCancelled)是否为 NO,或者控制器视图是否具有超级视图。

【讨论】:

  • 谢谢,通过检查视图上的布尔值意味着我将在 viewWillDisappear 中设置一个布尔值取消,而不是检查它?或者如何检查它是否有父视图?
  • 是的,添加一个BOOL@property,设置在viewWillDisappear中并检查加载方法。
  • 好吧,你需要看看为什么(控制器在容器中?)
  • 所以我先看看容器以及它在将呼叫转发给孩子方面的作用
  • 只有在选择器没有被触发的情况下才会取消(所以当使用performSelector:withObject:afterDelay:时) - 不会在选择器运行时取消......
【解决方案2】:

您可以在重新加载之前检查您的表格视图是否在屏幕上可见。你可以在 UIView 上编写一个辅助方法,甚至更好的类别来告诉给定的视图是否可见。

在 UIView 上的一个类别上声明 isVisibleOnScreen 方法并像这样实现它。

- (Bool)isVisibleOnScreen {

    CGRect viewFrame = self.frame;
    CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
    return CGRectIntersectsRect(viewFrame, appFrame);

}

但更好的异步工作方式是使用 Grand Central Dispatch。它使您可以更好地控制异步工作。

【讨论】:

  • GCD 提供的取消支持很少,您应该使用更高级别的NSOperationQueue API 来获得它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多