2012-12-14 4 views
0

Я создаю простое приложение, в котором пользователь может создавать отдельные объекты, которые сохраняются в CoreData.Основные данные и уникальный UIImage для объекта

Моя проблема: я хочу, чтобы каждый объект имел изображение, связанное с ним. Изображение загружается камерой iphone или персональной ручкой камеры, поэтому изображения будут иметь довольно большой вес (> 1 МБ каждый, я думаю). Я читал, что, когда вес изображений высок, хорошим способом справиться с этим является сохранение изображений в папке documentsDirectory и сохранение пути к coreData. Я достиг этого довольно легко.

Но как найти путь к изображению для привязки к уникальному объекту? CoreData действительно не обрабатывает уникальные идентификаторы, а два объекта могут иметь одно и то же имя ... Я искал вокруг objectID, но он не работает действительно хорошо, и я не уверен, что это хороший способ справиться с этим.

У вас есть идея? Есть ли другой простой способ, которого я совершенно не хватает? Заранее спасибо.

+0

, что вы имеете в виду уникальной группе? – fengd

+0

Уникальный объект. Извините, опечатка. –

ответ

5

использовать CoreData как идентификатор

id uri = [self sanitizeFilename:coreDataObject.objectID.URIRepresentation]; 
[NSString stringWithFormat:@"%@.png", uri]; 

помощник sanitizeFilename:

- (NSString *)sanitizeFileNameString:(NSString *)fileName { 
    NSCharacterSet* illegalFileNameCharacters = [NSCharacterSet characterSetWithCharactersInString:@"/\\?%*|\"<>"]; 
    return [[fileName componentsSeparatedByCharactersInSet:illegalFileNameCharacters] componentsJoinedByString:@""]; 
} 
+0

Это нормально использовать и изменять objectID вот так? Я не осмелился сделать что-то подобное. –

+0

В любом случае, это работает. Спасибо, Daij-Djan. –

+0

хорошо, я делаю это все время, конечно, ID нестабилен на нескольких устройствах, но для таких целей он работает –

1

Просто создайте Порядковый номер object_id в описании модели объекта CoreData и каждый раз, когда создается новый объект регистрирует это свойство одного и присвоить его объект, а затем использовать именовании как

[NSString stringWithFormat:@"object_%d_img.png", idNumber];

И сохраните его до NSDoctumentsDirectory.

Затем в объекте - (void)prepareForDeletion метод удаляет изображение.

Что касается увеличения значения id, создайте метод, который будет извлекать объект с наибольшим значением id - просто получите все объекты с дескриптором сортировки по id desc и используйте его + 1 при создании нового объекта.

+0

Ручной уникальныйID. Хороший ответ, но я искал что-то более «официальное». В любом случае, спасибо. –

-1

Я думаю, вам нужно будет создать уникальный идентификатор самостоятельно. Так как пользователь может иметь несколько объектов. поэтому, возможно, идентификатор изображения может быть названа такой

userId-objectId-somesalt 

сохранить значение пути объекта ObjectId

+0

не достаточно конкретный ИМО - его тот же Евгений сказал в основном –

+0

@ Daij-Djan взгляните на ответное время. не было ответов, когда я пытался ответить на него – fengd

0

Спасибо @ Daij-Djan. Я создал версию для Swift:

 var itemObjectId:String = item.objectID.URIRepresentation().absoluteString! 
    var fileName = NSString(format:"%@.png", FileHelper.sanitizeFileNameString(itemObjectId)) as String 

Helper для дезинфицировать:

struct FileHelper { 
static func sanitizeFileNameString(fileName:String) ->String { 
    let illegalFileNameCharacters:NSCharacterSet = NSCharacterSet(charactersInString: "/\\?%*|\"<>") 
    let components : [String] = fileName.componentsSeparatedByCharactersInSet(illegalFileNameCharacters) 
    let joinedString = join("", components) 
    return joinedString 
} 

}

Смежные вопросы