gpt4 book ai didi

ios - 单击以将图像添加到核心数据

转载 作者:行者123 更新时间:2023-11-28 22:10:59 24 4
gpt4 key购买 nike

我正在开发一个使用核心数据的应用程序,到目前为止一切正常。但是我还没有在其中使用图像。我想这样做,但我不知道从哪里开始。我想让用户单击一个按钮,让他们可以选择可以获取图像的位置。另外,是否可以让用户只输入图像的 URL 并将其保存到核心数据中?就是这样,所以如果有人能指出我正确的方向,我将不胜感激。谢谢!

到目前为止我的代码:https://github.com/jackintosh7/Core-Data

最佳答案

编辑 - 我更新了 saveImgData:fromURL 中的一些引用以匹配方法中传递的参数。我在 NSURL 协议(protocol)中使用了此方法的变体来拦截请求并缓存特定请求。某些实体参数可能不适用于您的问题。忽略那些(例如 encoding/lastModified/mimeType/response)。

要将图像保存到 CoreData,请试一试。

首先,下载您的图像。用户可以在文本输入字段中输入 url。 (andrewbuilder 列出的示例可以正常工作)

NSURL *imgURL = [NSURL URLWithString:myImgURL];
NSData *imgData = [NSData dataWithContentsOfURL:imgURL];

//a better way would be to do this asynchronously. Google "Lazy Image Loading" and
//you should find a suitable example app from Apple

设置您的 CoreData 实体以存储图像数据。这是一个示例,它存储的不仅仅是图像二进制数据。

Entity Screen Shot

然后将您的图像数据直接保存到 CoreData。我有一个 CoreData 管理器类,但你可能在 AppDelegate 中有你的 CoreData 堆栈,Apple 就是这样设置它们的。

-(void)saveImgData:(NSData*)myImgData fromURL:(NSString*)urlStr{

//If you have a CoreData manager class do something like this
CoreDataManager *cdm = [CoreDataManager defaultManager];
//Use private queue concurrency type for background saving
NSManagedObjectContext *ctx = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
//Set up the parent context, in this case is the mainMOC
//If you are using basic CoreData it would be the managedObjectContext on your AppDelegate
ctx.parentContext = cdm.mainMOC;

[ctx performBlock:^{
//performBlock executes on a background thread
CachedURLResponse *cacheResponse = [NSEntityDescription insertNewObjectForEntityForName:@"CachedURLResponse" inManagedObjectContext:ctx];
cacheResponse.relativeURLHash = [NSNumber numberWithInteger:[urlStr hash]];
cacheResponse.data = [myImgData copy];
cacheResponse.response = [NSKeyedArchiver archivedDataWithRootObject:self.response];
cacheResponse.url = [urlStr copy];
cacheResponse.timestamp = [NSDate date];
cacheResponse.mimeType = [self.response.MIMEType copy];
cacheResponse.encoding = [self.response.textEncodingName copy];
if ([self.headers objectForKey:@"Last-Modified"])
cacheResponse.lastModified = [self.headers objectForKey:@"Last-Modified"];

NSError *__block error;
if (![ctx save:&error])
NSLog(@"Error, Cache not saved: %@", error.userInfo);

[cdm.mainMOC performBlockAndWait: ^{
[cdm saveContext];
}];

}];
}

我的 CoreDataManager.h 看起来像这样: CoreDataManager.h

我的 CoreDataManager.m 文件如下所示:

#import "CoreDataManager.h"
#import <CoreData/CoreData.h>
@implementation CoreDataManager

@synthesize mainMOC = _mainMOC,
managedObjectModel = _mom,
persistentStoreCoordinator = _psc
;


+(CoreDataManager*)defaultManager
{
static CoreDataManager *_defaultMgr = nil;

static dispatch_once_t oncePred;
dispatch_once(&oncePred, ^{
_defaultMgr = [[CoreDataManager alloc] init];
});

return _defaultMgr;

}



-(id)init
{
if (self = [super init])
{
NSError *error = nil;
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyDatabase.sqlite"];
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyDataModelName" withExtension:@"momd"];

_mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
_psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);

_mainMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_mainMOC setPersistentStoreCoordinator:self.persistentStoreCoordinator];

}
return self;
}


- (void)saveContext
{
NSError *error = nil;
if (self.mainMOC != nil && ([self.mainMOC hasChanges] && ![self.mainMOC save:&error])) {
NSLog(@"CoreData save error: %@, %@", error, [error userInfo]);
}
}


#pragma mark - Core Data Stack

- (NSManagedObjectContext *)mainMOC
{
return _mainMOC;
}

- (NSManagedObjectModel *)managedObjectModel
{
return _mom;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
return _psc;
}

- (NSURL *)applicationDocumentsDirectory
{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}




@end

希望这能为您提供一个良好的起点。 Google“CoreData Class Reference”以获得关于该主题的一些非常好的读物。

关于ios - 单击以将图像添加到核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22951791/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com