在我的Mac OS X应用程序中,我将数据库推送到Dropbox,有点同步。当用户退出应用程序时,我想在退出之前上传数据库。所以我实现了applicationShouldTerminate:我调用同步方法并返回NSTerminateLater。 但是,底层的NSURLConnection根本不起作用 - 没有调用委托方法,也没有任何反应。所有上传代码都可以在其他地方使用,甚至当我从applicationShouldTerminate返回NSTerminateCancel时: 这种情况发生在Mac OS Lion 10.7 / XCode 4.6上,如果是这个问题。
那么,有什么评论吗?返回NSTerminateLater是否会在运行循环或其他地方更改某些内容?
答案 0 :(得分:3)
文档指出,在返回NSTerminateLater
后,应用程序将以NSModalPanelRunLoopMode
模式运行主运行循环,直到您调用replyToApplicationShouldTerminate:
。
默认NSURLConnection
对象未安排在NSModalPanelRunLoopMode
模式下(仅适用于NSDefaultRunLoopMode
)。因此连接正在工作,但委托消息未传递,因为主运行循环需要处于NSDefaultRunLoopMode
模式。
这允许Cocoa在呈现模式对话框(NSModalPanelRunLoopMode
)或跟踪鼠标拖动事件(NSEventTrackingRunLoopMode
)时暂停观察异步任务。虽然在某些情况下这种行为可能是合理的,但人们倾向于认为模态界面是糟糕的,因为它们会产生入侵,挫折和mode errors(因此你的问题)。
因此,为了使NSURLConnection
能够正确执行,您需要在NSDefaultRunLoopMode
和NSModalPanelRunLoopMode
模式下进行安排。这可以通过NSRunLoopCommonModes
来实现,NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[connection start];
是所有已声明为“common”的运行循环模式的别名(即Cocoa使用的所有模式)。
{{1}}