我使用可转换属性将颜色存储在我的二进制Core Data存储中,将属性的类指定为UIColor,如下所示:
#import "CoreDataEntity+CoreDataClass.h"
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface CoreDataEntity (CoreDataProperties)
+ (NSFetchRequest<CoreDataEntity *> *)fetchRequest;
@property (nullable, nonatomic, retain) UIColor *transformable;
@property (nullable, nonatomic, copy) NSString *string;
@end
NS_ASSUME_NONNULL_END
Run Code Online (Sandbox Code Playgroud)
在iOS 11 Beta中,这已经停止了这样的错误:
NSUnderlyingException=value for key 'NS.objects' was of unexpected class 'UIColor'. Allowed classes are '{(\n NSDecimalNumber,\n NSData,\n NSUUID,\n NSNumber,\n NSDate,\n NSArray,\n NSOrderedSet,\n NSDictionaryMapNode,\n NSString,\n NSSet,\n NSDictionary,\n NSURL,\n NSNull\n)}'.}";
NSUnderlyingException = "Can't read binary data from file";
}
Run Code Online (Sandbox Code Playgroud)
我设法在GitHub上的XCode项目中复制特定问题(必须与XCode Beta一起运行两次以获得错误).
在示范项目的存储类型由NSPersistentStoreDescription控制,将其设置为NSBinaryStoreType,这是我在AppDelegate中的exanple项目做,我在应用程序didFinishLaunchingWithOptions添加对象,否则就从核心数据的iOS11应用程序的标准模板.加上一个小的数据模型和类.
如果你运行项目两次,第一次创建数据存储区,一切都很好.第二次,数据存储区尝试打开并崩溃应用程序.如果我使用SQL支持的数据存储区,这个问题似乎只与二进制数据存储区有关.但是,我的应用程序在野外并使用二进制.
我已经向苹果公司报告了它作为一个错误,并在开发者论坛上寻求帮助,但Apple没有承认这个错误,也没有任何帮助.
随着iOS11发布日期的临近而我没有解决方案,我有点担心,我的应用程序只能在iOS11中运行.
我已经尝试将属性更改为NSData并查看是否可以取消归档数据,但它似乎仍然以某种方式内部存储为UIColor,并且数据库无法打开.
任何人都可以看到解决方法吗?我有野外的应用程序,并可能推出更新以转换数据存储区,然后iOS11可以为一些人工作,但这并不能保证所有用户得到修复程序,他们可能会丢失他们的数据.
编辑1:雷达编号:33895450
编辑2:我刚刚发现,这适用于核心数据中的任何可转换属性,错误消息中支持的值只是默认属性类型.
编辑3:出于好奇,我填写了transformable属性的所有字段(以前从未需要).我将"NSKeyedUnarchiveFromData"添加到核心数据实体的值变换器名称中,它应该是默认值,但您永远不会知道.没有效果.无论如何它必须使用值变换器才能知道它是UIColor.我填写自定义类字段为UIColor,没有效果. …
一直在试图找出从AVFoundation视频到openGLTexture的当前最佳路径,我找到的大部分内容都与iOS有关,我似乎无法在OSX中使其运行良好.
首先,这是我设置videoOutput的方式:
NSDictionary *pbOptions = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:kCVPixelFormatType_422YpCbCr8], kCVPixelBufferPixelFormatTypeKey,
[NSDictionary dictionary], kCVPixelBufferIOSurfacePropertiesKey,
nil];
self.playeroutput = [[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:pbOptions];
self.playeroutput.suppressesPlayerRendering = YES;
Run Code Online (Sandbox Code Playgroud)
我正在尝试三种不同的解决方案,其中只有一种似乎能够始终如一地工作,但不确定它是最快的.一个人工作一点点,然后分裂跳跃到整个地方的框架,一个只是产生黑色.
首先,使用glTexImage2D的工作解决方案
- (BOOL) renderWithCVPixelBufferForTime: (NSTimeInterval) time
{
CMTime vTime = [self.playeroutput itemTimeForHostTime:CACurrentMediaTime()];
if ([self.playeroutput hasNewPixelBufferForItemTime:vTime]) {
if (_cvPixelBufferRef) {
CVPixelBufferUnlockBaseAddress(_cvPixelBufferRef, kCVPixelBufferLock_ReadOnly);
CVPixelBufferRelease(_cvPixelBufferRef);
}
_cvPixelBufferRef = [self.playeroutput copyPixelBufferForItemTime:vTime itemTimeForDisplay:NULL];
CVPixelBufferLockBaseAddress(_cvPixelBufferRef, kCVPixelBufferLock_ReadOnly);
GLsizei texWidth = CVPixelBufferGetWidth(_cvPixelBufferRef);
GLsizei texHeight = CVPixelBufferGetHeight(_cvPixelBufferRef);
GLvoid *baseAddress = CVPixelBufferGetBaseAddress(_cvPixelBufferRef);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, self.textureName);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_STORAGE_HINT_APPLE , GL_STORAGE_CACHED_APPLE);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB, texWidth, texHeight, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, baseAddress); …Run Code Online (Sandbox Code Playgroud) 在安装Xcode 8后,我的应用程序将无法在我的设备上安装错误:应用程序安装失败"找不到此可执行文件的有效配置文件."
我在这里看到了很多关于这个问题的问题,我慢慢地经历了所有的答案,但无济于事.我以为它可能是ios10,但是我把我的一个设备放在ios9上,那个也没用.
我做了什么:
我现在已经被困在这一天了,因为我必须在真实设备上进行测试,它真的推迟了我的下一个版本,当一切都到位时,错误消息令人沮丧地模糊,我错过了某个可能给我的日志文件一个提示?
xcode ×2
avfoundation ×1
avplayer ×1
code-signing ×1
core-data ×1
ios ×1
ios11 ×1
macos ×1
objective-c ×1
opengl ×1
video ×1