我正在尝试在Core Data中轻量迁移SQLite存储.使用Xcode 4.3.1在Lion 10.7.3上工作.
在我的NSPersistentDocument子类(AccountDocument)中,我重写了用于配置持久性存储协调器的方法,以便它为迁移获取正确的选项:
- (BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError **)error
{
NSMutableDictionary *newStoreOptions;
if (storeOptions == nil) {
newStoreOptions = [NSMutableDictionary dictionary];
}
else {
newStoreOptions = [storeOptions mutableCopy];
}
[newStoreOptions setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
[newStoreOptions setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];
BOOL result = [super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:newStoreOptions error:error];
return result;
}
Run Code Online (Sandbox Code Playgroud)
(感谢Malcolm Crawford的提示:http://homepage.mac.com/mmalc/CocoaExamples/controllers.html)
当我运行应用程序时,它在NSPersistentDocument的实现中失败-managedObjectModel
:
* thread #1: tid = 0x2703, 0x00007fff931d9350 libobjc.A.dylib`objc_msgSend_vtable13 + 16, stop reason = EXC_BAD_ACCESS (code=13, …
Run Code Online (Sandbox Code Playgroud) 假设我有一个 SwiftUI 视图层次结构,如下所示:
ZStack() {
ScrollView {
...
}
Text("Hello.")
}
Run Code Online (Sandbox Code Playgroud)
该Text
视图阻止触摸事件到达底层 ScrollView
.
使用 UIKit,我会使用类似的东西.isUserInteractionEnabled
来控制它,但我找不到任何方法来使用 SwiftUI 来做到这一点。
我试过在文本视图上添加一个Gesture
带 aGestureMask
的.none
,但这似乎不起作用。
我希望我在这里遗漏了一些明显的东西,因为我需要在滚动视图的顶部放置一些状态信息。
我正在研究一些使用NSOperation
导入数据的代码.我希望用户能够撤消NSManagedObject
导入操作期间创建的实例.
据我所知,NSManagedObjectContext
-undoManager
对于从主线程执行的任何操作都是不可能的.从" 使用线程限制到支持并发"的" 核心数据编程指南"部分,我们有以下两个条件:
- 应该在托管对象上下文之间传递objectID(在不同的线程上)
- 在使用objectID之前,必须将托管对象保存在上下文中.
这是有道理的,因为托管对象需要在共享之前从私有存储(NSManagedObjectContext
)移动到公共存储(NSPersistentStore
).
不幸的是,该-save:
消息还会导致撤消堆栈中的任何托管对象被删除.从同一指南的 内存管理使用核心数据部分:
具有挂起更改(插入,删除或更新)的托管对象将由其上下文保留,直到其上下文发送save:,reset,rollback或dealloc消息,或者相应数量的撤消以撤消更改.
我已经尝试了几个方法来解决这个限制,一切最终都会导致主要线程上发生的大量工作(以及旋转的沙滩球.)任何使用撤消处理主线程创建的对象的线索都会非常非常感激.
-
已提交增强型雷达:rdar:// problem/8977725
cocoa core-data objective-c nsoperation nsmanagedobjectcontext
有没有办法让NSNumberFormatter(或者可能是任何其他NSFormatter)在NSPopover中工作?
弹出窗口中的NSTextField值绑定到NSViewController的representObject.当在字段中输入无效数字(例如,"asdf")时,在NSWindow中会显示一个表示该值无效的表格,其中包含呈现弹出窗口的NSView.
单击"确定"后,您将获得以下回溯:
* thread #1: tid = 0x4e666a, 0x00007fff931f9097 libobjc.A.dylib`objc_msgSend + 23, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
frame #0: 0x00007fff931f9097 libobjc.A.dylib`objc_msgSend + 23
frame #1: 0x00007fff8a1fa6c8 AppKit`-[NSTextView(NSSharing) becomeKeyWindow] + 106
frame #2: 0x00007fff8a080941 AppKit`-[NSWindow(NSWindow_Theme) acquireKeyAppearance] + 207
frame #3: 0x00007fff8a0800df AppKit`-[NSWindow becomeKeyWindow] + 1420
frame #4: 0x00007fff8a07f5c6 AppKit`-[NSWindow _changeKeyAndMainLimitedOK:] + 803
frame #5: 0x00007fff8a1a205d AppKit`-[NSWindow _orderOutAndCalcKeyWithCounter:stillVisible:docWindow:] + 1156
frame #6: 0x00007fff8a0876c5 AppKit`-[NSWindow _reallyDoOrderWindow:relativeTo:findKey:forCounter:force:isModal:] + 3123
frame #7: 0x00007fff8a0867f0 AppKit`-[NSWindow _doOrderWindow:relativeTo:findKey:forCounter:force:isModal:] + 786
frame #8: 0x00007fff8a086470 AppKit`-[NSWindow …
Run Code Online (Sandbox Code Playgroud) 我有一个水平滚动视图,我想以编程方式设置位置。这是视图的主体:
let radius = CGFloat(25)
let scrollWidth = CGFloat(700)
let scrollHeight = CGFloat(100)
let spacing = CGFloat(20)
let circleDiameter = CGFloat(50)
...
var body: some View {
GeometryReader { viewGeometry in
ScrollView () {
VStack(spacing: 0) {
Spacer(minLength: spacing)
Circle()
.fill(Color.black.opacity(0.5))
.scaledToFit()
.frame(width: circleDiameter, height: circleDiameter)
ScrollView(.horizontal) {
Text("The quick brown fox jumps over the lazy dog. Finalmente.")
.font(Font.title)
.frame(width: scrollWidth, height: scrollHeight)
.foregroundColor(Color.white)
.background(Color.white.opacity(0.25))
}
.frame(width: viewGeometry.size.width, height: scrollHeight)
.padding([.top, .bottom], spacing)
Circle()
.fill(Color.white.opacity(0.5))
.scaledToFit()
.frame(width: circleDiameter, height: circleDiameter) …
Run Code Online (Sandbox Code Playgroud) 我有一个AppleEventDescriptor
地方需要获取发送应用程序的包标识符.Apple Event包含一个typeProcessSerialNumber
可以被强制转换为ProcessSerialNumber
.
问题是GetProcessPID()
在10.9 中被弃用了,并且似乎没有得到制裁pid_t
可以用来实例化NSRunningApplication
使用的方法-runningApplicationWithProcessIdentifier:
.
我发现的所有其他选项都存在于Processes.h中,也不推荐使用.
我是否遗漏了某些内容,或者我是否必须遵守此弃用警告?
我目前正在使用一个NSPersistentDocument
子类,用于NSOperation
在后台导入数据.根据文档,我正在观察NSManagedObjectContextDidSaveNotification
后台任务中的保存并将通知传播到NSManagedObjectContext
主线程中-mergeChangesFromContextDidSaveNotification:
.
一切正常,但它为将数据导入新文档的用户提供了一个奇怪的工作流程.他们需要在导入之前保存一个空文档(否则-save:
失败,因为文档没有为其配置URL NSPersistentStoreCoordinator
.)除了某种"新文档设置"向导确保我没有办法解决这个问题.-writeToURL:ofType:forSaveOperation:originalContentsURL:error:
在导入之前调用.
此外,后台的导入任务似乎排除了NSUndoManager
在主线程上使用a.(我假设跨线程共享托管对象上下文的撤消管理器是不安全的.)从用户的角度来看,没有办法撤消导入期间创建的所有新对象.
我已经阅读了核心数据编程指南和Marcus Zarra的书,但我仍然对框架的这个方面不熟悉.希望我忽略了一些事情:如果没有,我会根据这些限制调整我的应用程序(Core Data的好处远远超过这些用户界面限制.)
谢谢你的时间!
-
根据Peter Hosey在下面的建议,我在导入之前添加了以下代码来创建临时持久存储:
NSPersistentStoreCoordinator *persistentStoreCoordinator = [self.managedObjectContext persistentStoreCoordinator];
if ([[persistentStoreCoordinator persistentStores] count] == 0) {
// create an in-memory store to use temporarily
NSError *error;
NSPersistentStore *persistentStore = [persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:&error];
if (! persistentStore) {
NSLog(@"error = %@", error); // TODO: better error handling
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在保存面板中选择文件后,临时持久性存储将迁移到所选URL的SQLite存储:
- (BOOL)writeToURL:(NSURL *)absoluteURL …
Run Code Online (Sandbox Code Playgroud) 我有两个实例NSManagedObjectContext
:一个在主线程中使用,另一个在后台线程中使用(通过NSOperation
.)为了线程安全,这两个上下文只共享一个NSPersistentStoreCoordinator
.
我遇到的问题是第一个上下文(在主线程上)中的挂起更改在-save
执行之前不可用于第二个上下文.这是可以理解的,因为共享的持久性存储不会有副本NSManagedObjects
由被跟踪-insertedObjects
,-updatedObjects
以及-deletedObjects
被持久.
遗憾的是,这会给用户体验带来问题:任何未保存的更改都不会出现在后台线程中生成的(耗时)报告中.
我能想到的唯一解决方案是讨厌的:从第一个上下文中取出插入的,更新的和删除的对象,并将它们移植到第二个上下文的对象图上.数据集中有一些非常复杂的关系,所以我对这个方向犹豫不决.我希望有人在这里作为更好的解决方案.
core-data objective-c nsoperation nsmanagedobject nsmanagedobjectcontext
我们有一个Xcode项目,包括用于基于NIB的UI的Retina图形和WebView UI.该项目为Mac构建了一个应用程序.
该项目使用两个单独的构建阶段将这些图形移动到最终应用程序中.第一种是传统的Copy Bundle Resource,它将1x和2x图形都集成到应用程序包中.第二个是复制文件构建阶段,它将Web图形复制到具有"图形"子路径的单独的资源目标中.
(这避免了一些命名冲突,让网页设计师使用熟悉的"graphics/whatever.png"路径.)
构建此项目时,我们会得到一个依赖性分析错误,该错误表示:
复制文件构建阶段无法处理多表示图像'whatever@2x.png' - 尝试复制资源构建阶段,或禁用COMBINE_HIDPI_IMAGES.
关闭名为"组合高分辨率图稿"的部署构建设置很容易,但这会影响基于NIB的UI以及WebView UI中使用的图形.随着选项打开,button.png
并button@2x.png
共同结合成一个button.tiff
应用程序包的资源文件夹中.没有它,使用原始名称.
据我所知,应用程序运行正常,但由于COMBINE_HIDPI_IMAGES默认设置为开启,我怀疑将图形部署为单个文件有一些好处(可能更快加载和缓存).
理想情况下,我只想在复制文件构建阶段禁用COMBINE_HIDPI_IMAGES.我无法想办法做到这一点,希望这里的其他人可以......
2012年8月27日更新
对于此特定应用程序,解决此问题的最简单方法是使用2x版本替换所有HTML图像.由于标签指定宽度和高度,因此在非Retina设备上图像按比例缩小50%.质量很好,因为它们是从本地文件系统加载的,所以没有可察觉的性能影响.
2012年8月28日更新
我们采用的另一种方法是使用命名约定.一些HTML图像是使用CSS指定的(媒体查询选择Retina或非Retina版本.)为了避免将这些图像组合成单个HiDPI图像的问题,我们使用whatever.png和whatever_retina.png.
我有一个看似简单的设计,我无法使用自动布局约束表达:在UIScrollView中,我需要显示一个居中的文本列,其最小宽度为300磅,最大宽度为500磅(保持边距为在所有情况下至少10分.)
文本列实际上是一个UIStackView,但这对于这个讨论并不重要,视图可以很容易地成为具有宽高比的UIImageView.
我尝试使用具有不同内容拥抱和压缩阻力的填充视图,具有水平轴的堆栈视图,具有小于或等于常数的宽度约束等.我想在故事板内完成所有操作,在周围嗅探布局更改或使用大小类感觉就像作弊.
(我的一些实验导致Xcode在更新故事板时挂起:给我一个痛苦的暗示,即没有针对这些约束的解决方案.)
在你提出建议之前,我已经了解了UIScrollView和Auto Layout的细微之处.
这似乎是一个无法解决的问题,这是一种耻辱.这是一种非常常见的模式,设计师喜欢使用CSS(使用最小宽度和最大宽度).我希望我在这里遗漏一些东西,而且对汽车布局有更深入了解的人可以解释一种方法来做到这一点(并作为其他想做同样事情的人的参考.)
更新:以下Adam和Ben的建议对实现此布局非常有帮助.但是一旦你得到多个文本块,自动布局迭代求解器就无法处理它(并且Xcode会挂起.)有关更多信息:http://openradar.appspot.com/25173433
core-data ×4
objective-c ×4
cocoa ×3
nsoperation ×3
swiftui ×2
uiscrollview ×2
appkit ×1
applescript ×1
autolayout ×1
ios ×1
macos ×1
nsformatter ×1
nspopover ×1
osx-lion ×1
paintcode ×1
swift ×1
xcode ×1