iphone - 如何在页面 View Controller 的 ModelController.m 中构建数据源的方法内实现 "Cancel"按钮

标签 iphone ios objective-c cocoa

我有一个在 3 个文件中实现的页面 View Controller 。其中之一,ModelController.m 实现“generateData”方法,该方法基本上只是为该页面 View Controller 构建和格式化所有页面。在这个方法中,我做的第一件事是创建一个带有“取消”按钮的进度栏弹出窗口。然后,在 while() 循环内,我继续构建页面,同时,每第 10 页,我更新进度条,以便用户查看应用程序仍在生成输出。

一旦“generateData”方法完成,即构建所有页面(根据用户输入,可能有超过 1,000 个甚至 10,000 个页面),它会将“self”返回到 RootViewController.m 内的方法,该方法又通过在 DataViewController.m 中生成“dataObject”中的数据到“viewWillAppear”,最终向用户显示该对象中的页面。

除了“取消”按钮之外,一切都很好。由于“generateData”方法在主线程上运行,因此它会阻塞并且“取消”按钮完全无响应。我所说的“ block ”当然是指它占用所有 CPU 周期,不允许执行任何其他操作,并且生成 10,000 个页面可能需要一分钟多的时间,所以我真的希望允许用户取消该操作。

我尝试为包含“取消”按钮的进度栏弹出窗口创建一个单独的线程,但这不起作用,因为所有 UI 操作都需要在应用程序的主线程上执行。

几乎似乎起作用的是,当我将“generateData”方法放在单独的线程上并将进度栏保留在主线程上时。这会工作得很好,除了现在“generateData”被放在另一个线程上在后台执行并立即返回,因此返回空的“self”或更确切地说空的“dataObject”,导致崩溃,因为该对象中还没有任何内容显示。

那么我如何检查“generateData”线程是否完成,并仅在完成时“返回自身”?我真的不能有一些 BOOL true/false 变量并在循环中执行它,因为主线程上的循环将再次阻止“取消”按钮。

或者,在 iOS 中的冗长方法上实现“取消”按钮的正确方法是什么?也许我做的都是错的,但我一生都找不到正确的方法。

提前感谢您的帮助,代码相当广泛,这就是为什么我没有包含任何代码,但我希望我的描述能让您很好地了解正在发生的事情。如果有帮助的话我可以提供代码。

最佳答案

正确的方法是异步加载数据(在后台线程上)并更新主(UI)线程以更新进度条等...但是您可能不需要进度条,因为您加载这些页面的速度可能比用户翻转它们的速度要快,因此加载 100 个页面并让用户在您继续加载下一个 99,900 个页面时玩...除非这些可能不是您应该使用的确切数字...

如果您继续使用进度 View 和取消按钮,那么当用户按“取消”时,您将取消后台线程,这将响应,因为您的数据生成是在后台线程上...

查看 Grand Central DispatchNSInvocationOperations

Here's a good tutorial by Ray Wenderlich to get you started.

关于iphone - 如何在页面 View Controller 的 ModelController.m 中构建数据源的方法内实现 "Cancel"按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15888192/

相关文章:

ios - 向 UIViewController 外观添加淡入淡出动画

iphone - 当我的 iphone 应用程序在后台时,如何在设置包中获取 Bool 变量集的通知?

objective-c - PhoneGap/Cordova iOS : capture video with a duration limit (ie. 30 秒)

ios - 使用 FSCalendar 的事件表

ios - iPad 2/Retina iPad,应用程序如何识别它在哪个设备上运行?

ios - 如何在 iPhone 中管理多任务

iphone - 编写适用于 iOS 和 Mac OS 的类

iphone - 如何获取给定 PFUser 的 facebook 用户名?

ios - 如何打开/关闭 iPhone 相机闪光灯 swift 2?

ios - 无法正确读取从 UIView 创建的 UIImage 的颜色数据