applicationShouldTerminate和NSURLConnection

时间:2013-12-21 10:41:05

标签: objective-c macos cocoa nsurlconnection

在我的Mac OS X应用程序中,我将数据库推送到Dropbox,有点同步。当用户退出应用程序时,我想在退出之前上传数据库。所以我实现了applicationShouldTerminate:我调用同步方法并返回NSTerminateLater。 但是,底层的NSURLConnection根本不起作用 - 没有调用委托方法,也没有任何反应。所有上传代码都可以在其他地方使用,甚至当我从applicationShouldTerminate返回NSTerminateCancel时: 这种情况发生在Mac OS Lion 10.7 / XCode 4.6上,如果是这个问题。

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

1 个答案:

答案 0 :(得分:3)

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

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

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

因此,为了使NSURLConnection能够正确执行,您需要在NSDefaultRunLoopModeNSModalPanelRunLoopMode模式下进行安排。这可以通过NSRunLoopCommonModes来实现,NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; [connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; [connection start]; 是所有已声明为“common”的运行循环模式的别名(即Cocoa使用的所有模式)。

{{1}}