gpt4 book ai didi

objective-c - applicationShouldTerminate 和 NSURLConnection

转载 作者:行者123 更新时间:2023-12-03 16:31:55 25 4
gpt4 key购买 nike

在我的 Mac OS X 应用程序中,我将数据库推送到 Dropbox,有点同步。当用户退出应用程序时,我想在退出之前上传数据库。所以我实现了 applicationShouldTerminate: ,我在其中调用同步方法并返回 NSTerminateLater。然而,底层 NSURLConnection 根本不起作用 - 没有调用委托(delegate)方法,并且什么也没有发生。所有上传代码都可以从其他地方正常工作,甚至当我从 applicationShouldTerminate 返回 NSTerminateCancel 时:如果是这样的话,这种情况会发生在 Mac OS Lion 10.7/XCode 4.6 上。

那么,有什么意见吗?返回 NSTerminateLater 是否会更改运行循环中或其他地方的某些内容?

最佳答案

文档指出,返回 NSTerminateLater 后,应用程序将以 NSModalPanelRunLoopMode 模式运行主运行循环,直到您调用 replyToApplicationShouldTerminate:

默认情况下,NSURLConnection 对象不会调度为 NSModalPanelRunLoopMode 模式(仅适用于 NSDefaultRunLoopMode)。因此,连接正在工作,但委托(delegate)消息未传递,因为主运行循环需要处于 NSDefaultRunLoopMode 模式。

这允许 Cocoa 在呈现模式对话框 (NSModalPanelRunLoopMode) 或跟踪鼠标拖动事件 (NSEventTrackingRunLoopMode) 时暂停异步任务的观察。尽管这种行为在某些情况下可能是合理的,但人们倾向于认为模式界面是不好的,因为它们会产生侵入、挫败感和 mode errors (这就是你的问题)。

因此,为了让您的 NSURLConnection 正确执行,您需要将其安排在 NSDefaultRunLoopModeNSModalPanelRunLoopMode 模式下。这可以通过 NSRunLoopCommonModes 来实现,它是所有已声明为“common”的运行循环模式的别名(即 Cocoa 使用的所有模式)。 p>

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[connection start];

关于objective-c - applicationShouldTerminate 和 NSURLConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20718098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com