- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在开发一个带有 UITableView 的 iOS 应用程序,它会在某个阶段添加或删除它的一堆行。由于有大量行,此操作可能需要很长时间。但是,我无法轻易确定它是否需要很长时间。
仅当此操作需要很长时间时,我才想显示 UIActivityIndicator(微调器)。我一直这样做的方法是开始冗长的操作,经过一些延迟(比如 0.5 秒)后,我们测试操作是否仍在运行,如果是,我们开始显示 UIActivityIndicator。
如果您可以在后台线程中运行冗长的操作,这就没有问题。但是,这种特殊情况很棘手,因为冗长的操作 (deleteRowsAtIndexPaths:withRowAnimation:) 必须在主线程中运行(如果我在后台线程中运行此方法,当后台线程尝试更新 UI 时应用程序偶尔会崩溃)。
我最近尝试的是这样的:
- (void) manipulateTableView
{
stillBusy = YES;
[self performSelectorInBackground:@selector(waitBeforeShowingBusyIndicatorForView:) withObject:view];
.
.
.
[self performSelectorOnMainThread:@selector(deleteRowsAtIndexPathsWithRowAnimation:) withObject:args waitUntilDone:YES];
stillBusy = NO;
}
- (void) waitBeforeShowingBusyIndicatorForView:(UIView*) view
{
usleep((int) (BUSY_INDICATOR_DELAY * 1000000));
if (stillBusy)
[self performSelectorOnMainThread:@selector(showBusyIndicatorForView:) withObject:view waitUntilDone:NO];
}
因为 showBusyIndicatorForView: 操作 UI,它必须在主线程上调用,否则应用程序可能会崩溃。
当 deleteRowsAtIndexPaths:withRowAnimation: 耗时很长时,waitBeforeShowingBusyIndicatorForView: 中的延迟到期,performSelectorOnMainThread:... 方法被调用并立即返回。但是随后仅在对 deleteRowsAtIndexPaths:withRowAnimation: 的调用 完成后才调用 showBusyIndicatorForView: 方法,这违背了目的。
我想我明白为什么会这样。 deleteRowsAtIndexPaths:withRowAnimation: 方法在主循环的迭代中运行,并且在运行时,对 showBusyIndicatorForView: 的调用作为主循环的消息排队。只有在主循环完成执行 deleteRowsAtIndexPaths:withRowsAnimation: 之后,它才会轮询队列以获取下一条消息,然后开始执行 showBusyIndicatorForView:。
有没有办法让这个东西正常工作。是否可以中断主循环并使其立即执行 showBusyIndicatorForView:?
最佳答案
我突然想到了两个选项:
修改长时间运行的前台例程,将其分成多个 block ,重复将进程的每个步骤分别分派(dispatch)到主队列。并以您设计流程的方式进行,以便它分派(dispatch)慢速前台任务的每个部分,并且仅在前一部分完成时将下一步分派(dispatch)到主队列。 (不要只是为主队列排队大量进程。)这样,您就可以让微调器有机会在其他作业排队时与它们相吻合。如果您对删除进行动画处理,这可能是不可能的,但话又说回来,我无法想象执行单个 deleteRowsAtIndexPaths
会花那么长时间。
可能更好,如果更新需要这么长时间,我会问这是为什么。 deleteRowsAtIndexPaths
不应考虑这一点。具体来说,不要发出多个 deleteRowsAtIndexPaths
,而是构建要删除的行的 NSMutableArray
,然后在单个 UI 调用中删除它们。我刚刚删除了 998 行(包括它们的底层模型对象),这几乎是瞬间完成的。
如果可能的话,我会倾向于选项 2。
关于iphone - 长时间操作延迟后自旋事件指示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14346634/
我正在尝试将 WPF CodeBehid 事件(如 Event、Handler、EventSetter)转换为 MVVM 模式。我不允许使用 System.Windows.Controls,因为我使用
我可能误解了 Backbone 中的事件系统,但是当我尝试以下代码时什么也没有发生。当我向 Backbone.Events 扩展对象添加新属性时,它不应该触发某种更改、更新或重置事件吗?就像模型一样吗
我遇到了一个简单的问题,就是无法弄清楚为什么它不起作用。我有一个子组件“app-buttons”,其中我有一个输入字段,我想听,所以我可以根据输入值过滤列表。 如果我将输入放在我有列表的根组件中,一切
System.Timers.Timer 的 Elapsed 事件实际上与 System.Windows.Forms.Timer 的 Tick 事件相同吗? 在特定情况下使用其中一种比使用另一种有优势吗
嗨,这个 javascript 代码段是什么意思。(evt) 部分是如此令人困惑.. evt 不是 bool 值。这个怎么运作? function checkIt(evt) { evt
我正在使用jquery full calendar我试图在事件被删除时保存它。 $('calendar').fullCalendar ({
我有两个链接的鼠标事件: $('body > form').on("mousedown", function(e){ //Do stuff }).on("mouseup", function(
这是我的代码: $( '#Example' ).on( "keypress", function( keyEvent ) { if ( keyEvent.which != 44 ) {
我尝试了 dragOver 事件处理程序,但它没有正常工作。 我正在研究钢琴,我希望能够弹奏音符,即使那个键上没有发生鼠标按下。 是否有事件处理程序? 下面是我正在制作的钢琴的图片。 最佳答案 您应该
当悬停在相邻文本上时,我需要使隐藏按钮可见。这是通过 onMouseEnter 和 onMouseLeave 事件完成的。但是当点击另外的文本时,我需要使按钮完全可见并停止 onMouseLeave
我有ul标签内 div标签。我申请了mouseup事件 div标记和 click事件 ul标签。 问题 每当我点击 ul标签,然后都是 mouseup和 click事件被触发。 我想要的是当我点击 u
我是 Javascript 和 jQuery 的新手,所以我有一个非常愚蠢的疑问,请耐心等待 $(document).click(function () { alert("!"); v
我有一个邮政编码解析器,我正在使用 keyup 事件处理程序来跟踪输入长度何时达到 5,然后查询服务器以解析邮政编码。但是我想防止脚本被不必要地调用,所以我想知道是否有一种方法可以跟踪 keydown
使用事件 API,我有以下代码来发布带有事件照片的事件 $facebook = new Facebook(array( "appId" => "XXX", "se
首次加载 Microsoft Word 时,既不会触发 NewDocument 事件也不会触发 DocumentOpen 事件。当 Word 实例已打开并打开新文档或现有文档时,这些事件会正常触发。
我发现了很多相关问题(这里和其他地方),但还没有具体找到这个问题。 我正在尝试监听箭头键 (37-40) 的按键事件,但是当以特定顺序使用箭头键时,后续箭头不会生成“按键”事件。 例子: http:/
给定的 HTML: 和 JavaScript 的: var $test = $('#test'); $test.on('keydown', function(event) { if (eve
我是 Node.js 的新手,希望使用流运行程序。对于其他程序,我必须同时启动一个服务器(mongodb、redis 等),但我不知道我是否应该用这个运行一个服务器。请让我知道我哪里出了问题以及如何纠
我正在尝试使用 Swift 和 Cocoa 创建一个适用于 OS X 的应用程序。我希望应用程序能够响应关键事件,而不将焦点放在文本字段上/文本字段中。我在 Xcode 中创建了一个带有 Storyb
我有以下代码: (function(w,d,s,l,i){ w[l]=w[l]||[];w[l].push({
我是一名优秀的程序员,十分优秀!