- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
持续更新值绑定(bind)选项会触发连续的 autosaveInPlace 尝试(对于您键入的每个字符)。
大家好,这是我的第一个问题!
我希望我能正确提问……:)
我正在尝试将 Lion 的自动保存机制添加到我的基于核心数据文档的应用程序中。在我的 NSPersistentDocument 子类中,我重写了返回 YES
的 +(BOOL)autosaveInPlace
方法,并且所有功能都正常工作(保存、新菜单、版本浏览器...)。
我的问题是,当我使用连续更新值选项在绑定(bind)到模型的文本字段中输入时,自动保存系统会在每次击键时触发保存操作!旋转的沙滩球没有出现(可能是因为我的文档相当小),但打字真的很慢。
每次按键都会调用 AutosaveInPlace
,随后调用 saveToURL...
和 writeToURL...
方法。
我在网上几乎找不到任何关于这个主题的信息,在 Apple 的官方文档中就更少了。
在自动保存和版本 WWDC '11 视频中,工程师提供了一个不完整的示例,说明当 [self auto savingIsImplicitlyCancellable]
返回 YES
时如何取消自动保存,但在我的在这种情况下,此方法始终返回NO
。这必须是预期的行为:该值必须不断更新,并且由于磁盘上的文件必须始终与用户在屏幕上看到的内容相同,因此不得取消此保存。
我在网上找到了一个更有用的示例,说明如何从一开始就阻止保存(ovverriding save...
方法而不是 write...
一)。
-(void)saveToURL:(NSURL *)url
ofType:(NSString *)typeName
forSaveOperation:(NSSaveOperationType)saveOperation
completionHandler:(void (^)(NSError *errorOrNil))completionHandler {
if (saveOperation == NSAutosaveInPlaceOperation) {
if ([self isWritingInMyTextField]) {
completionHandler([NSError errorWithDomain:NSCocoaErrorDomain
code:NSUserCancelledError
userInfo:nil]);
return;
}
}
[super saveToURL:url ofType:typeName forSaveOperation:saveOperation completionHandler:completionHandler];
}
这正在工作。在自动保存的情况下,如果我的文本字段具有焦点,我会将记录的静默 cocoa 错误传递给完成处理程序,并且保存不会发生,UI 会像以前一样响应。原始发帖者声称,通过这种方式,自动保存实际上会延迟到当前事件结束,但我对此不确定。
我的问题是,我不想观察每个文本字段以进行开始/结束编辑,并且必须时不时地手动触发自动保存,因为我阻止系统在我执行此操作时执行此操作。我在文本字段中书写。系统应该明白在单次击键的基础上触发保存是不合理的。
在 WWDC ’11 视频中,工程师指出了一种通过 NSRunLoop 和事件检查用户事件的方法,但这远远超出了我的理解范围。我搜索了 NSRunLoop
、NSEvent
的文档,但我不知道如何获取信息“用户正在主动输入内容!”。
如果有人能在这个主题上为我指出正确的方向,我将不胜感激。
如果有人知道处理此问题的推荐方法,那就更好了!
作为最后一个考虑因素,我可以在 NSPersistentDocument 的文档中读到“NSPersistentDocument 不支持 NSDocument 的异步保存 API,因为该 API 需要在多个线程上访问文档的状态,这违反了 NSManagedObjectContext 的要求。”。这是否意味着除非您的应用程序的文档非常小,否则根本不应该使用自动保存?嗯,苹果似乎希望自动保存成为所有新应用程序的新处理方式,所以我无法弄清楚如果开发人员必须放弃核心数据,它会如何发生。
最佳答案
这是我的工作答案。
+(BOOL)autosavesInPlace { return YES; }
-(BOOL)isUserTyping {
NSUInteger eventType = [[NSApp currentEvent] type];
return (eventType == NSKeyDown ||
eventType == NSKeyUp ||
eventType == NSFlagsChanged);
}
-(void)saveToURL:(NSURL *)url
ofType:(NSString *)typeName
forSaveOperation:(NSSaveOperationType)saveOperation
completionHandler:(void (^)(NSError *errorOrNil))completionHandler {
if (saveOperation == NSAutosaveInPlaceOperation) {
if ([self isUserTyping]) {
completionHandler([NSError errorWithDomain:NSCocoaErrorDomain
code:NSUserCancelledError
userInfo:nil]);
return;
}
}
[super saveToURL:url ofType:typeName forSaveOperation:saveOperation completionHandler:completionHandler];
}
我不知道我的 isUserTyping
方法是否是最好的方法。 WWDC ’11 视频工程师使用运行循环来检查用户事件对我来说仍然是个谜!
关于cocoa - 如何通过不断更新值绑定(bind)选项来防止连续 autosaveInPlace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8219557/
我查看了网站上的一些问题,但还没有完全弄清楚我做错了什么。我有一些这样的代码: var mongoose = require('mongoose'), db = mongoose.connect('m
基本上,根据 this bl.ocks,我试图在开始新序列之前让所有 block 都变为 0。我认为我需要的是以下顺序: 更新为0 退出到0 更新随机数 输入新号码 我尝试通过添加以下代码块来遵循上述
我试图通过使用随机数在循环中设置 JSlider 位置来模拟“赛马”的投注结果。我的问题是,当然,我无法在线程执行时更新 GUI,因此我的 JSlider 似乎没有在竞赛,它们从头到尾都在运行。我尝试
该功能非常简单: 变量:$table是正在更新的表$fields 是表中的字段,$values 从帖子生成并放入 $values 数组中而$where是表的索引字段的id值$indxfldnm 是索引
让我们想象一个环境:有一个数据库客户端和一个数据库服务器。数据库客户端可以是 Java 程序或其他程序等;数据库服务器可以是mysql、oracle等。 需求是在数据库服务器上的一个表中插入大量记录。
在我当前的应用程序中,我正在制作一个菜单结构,它可以递归地创建自己的子菜单。然而,由于这个原因,我发现很难也允许某种重新排序方法。大多数应用程序可能只是通过“排序”列进行排序,但是在这种情况下,尽管这
Provisioning Profile 有 key , key 链依赖于它。我想知道 key 什么时候会改变。 Key will change after renew Provisioning Pr
截至目前,我在\server\publications.js 中有我的 MongoDB“选择”,例如: Meteor.publish("jobLocations", function () { r
我读到 UI 应该始终在主线程上更新。但是,当谈到实现这些更新的首选方法时,我有点困惑。 我有各种函数可以执行一些条件检查,然后使用结果来确定如何更新 UI。我的问题是整个函数应该在主线程上运行吗?应
我在代理后面,我无法构建 Docker 镜像。 我试过 FROM ubuntu , FROM centos和 FROM alpine ,但是 apt-get update/yum update/apk
我构建了一个 Java 应用程序,它向外部授权客户端公开网络服务。 Web 服务使用带有证书身份验证的 WS-security。基本上我们充当自定义证书颁发机构 - 我们在我们的服务器上维护一个 ja
因此,我有时会在上传新版本时使用 app_offline.htm 使应用程序离线。 但是,当我上传较大的 dll 时,我收到黄色错误屏幕,指出无法加载 dll。 这似乎与我对 app_offline.
我刚刚下载了 VS Apache Cordova Tools Update 5,但遇到了 Node 和 NPM 的问题。我使用默认的空白 cordova 项目进行测试。 版本 如果我在 VS 项目中对
所以我有一个使用传单库实例化的 map 对象。 map 实例在单独的模板中创建并以这种方式路由:- var app = angular.module('myApp', ['ui', 'ngResour
我使用较早的 Java 6 u 3 获得的帧速率是新版本的两倍。很奇怪。谁能解释一下? 在 Core 2 Duo 1.83ghz 上,集成视频(仅使用一个内核)- 1500(较旧的 java)与 70
我正在使用 angular 1.2 ng-repeat 创建的 div 也包含 ng-click 点击时 ng-click 更新 $scope $scope 中的变化反射(reflect)在使用 $a
这些方法有什么区别 public final void moveCamera(CameraUpdate更新)和public final void animateCamera (CameraUpdate
我尝试了另一篇文章中某人评论中关于如何将树更改为列表的建议。但是,我在某处(或某物)有未声明的变量,所以我列表中的值是 [_G667, _G673, _G679],而不是 [5, 2, 6],这是正确
实现以下场景的最佳方法是什么? 我需要从java应用程序调用/查询包含数百万条记录的数据库表。然后,对于表中的每条记录,我的应用程序应该调用第三方 API 并获取状态字段作为响应。然后我的应用程序应该
只是在编写一些与 java 图形相关的代码,这是我今天的讲座中的非常简单的示例。不管怎样,互联网似乎说更新不会被系统触发器调用,例如调整框架大小等。在这个例子中,更新是由这样的触发器调用的(因此当我只
我是一名优秀的程序员,十分优秀!