Код: Выделить всё
extension Note {
@nonobjc public class func fetchRequest() -> NSFetchRequest {
return NSFetchRequest(entityName: "Note")
}
@NSManaged public var heavy_body: String?
@NSManaged public var lite_title: String?
@NSManaged public var uuid: UUID?
}
< /code>
только извлечение столбца Lite_title для сохранения использования памяти < /h2>
При одновременном отображении сотни до тысяч заметок < /code>. Это для минимизации использования памяти. Вот код для достижения такой цели.
Следующий код будет загружать только все примечанияprivate lazy var fetchedResultsController: NSFetchedResultsController = {
let fetchRequest: NSFetchRequest = Note.fetchRequest()
// We will NOT fetch "heavy_body" explicitly during app start, because it is a heavy resource.
fetchRequest.propertiesToFetch = [
"lite_title"
]
fetchRequest.sortDescriptors = [
NSSortDescriptor(key: "lite_title", ascending: false)
]
// Create a fetched results controller and set its fetch request, context, and delegate.
let controller = NSFetchedResultsController(
fetchRequest: fetchRequest,
managedObjectContext: CoreDataStack.INSTANCE.persistentContainer.viewContext,
sectionNameKeyPath: nil,
cacheName: nil
)
controller.delegate = self
return controller
}()
< /code>
Попытка принести Heavy_body для 1 примечания, затем, надеюсь, сможет отказаться от Heavy_body из памяти < /h2>
во время редактирования 1 примечания, это то, что я закончу, чтобы достичь < /p>
[list]
[*], чтобы прочитать lete_title < /p>. lite_title[*]Attempt to read heavy_body will trigger SQLite DB operation, because heavy_body is not yet fetched into the memory due to exclusion from fetchRequest.propertiesToFetch
[*]In order to remove heavy_body from the memory, call note.managedObjectContext? Надеемся, что соедините с помощью информации fetchrequest.propertiestofetch , coredata достаточно умна, чтобы выяснить, он должен только «вина» Heavy_body , но оставить lite_title untouched.
[/list]
Мы пишем следующий код, чтобы достичь вышеуказанного целей
Мы пишем следующий код, чтобы достичь вышеуказанного целей
.
Код: Выделить всё
@IBAction func readData(_ sender: Any) {
guard let sections = self.fetchedResultsController.sections else { return }
guard let note = sections[0].objects?[0] as? Note else { return }
if note.isFault {
print(">>>> This is a fault.\n")
} else {
print(">>>> This is NOT a fault.\n")
}
print(">>>> Read lite_title\n")
let lite_title = note.lite_title
print(">>>> After accessing lite_title, isFault is \(note.isFault)\n")
print(">>>> Read heavy_body\n")
let heavy_body = note.heavy_body
print(">>>> After accessing heavy_body, isFault is \(note.isFault)\n")
// Move the object back to fault.
note.managedObjectContext?.refresh(note, mergeChanges: false)
print(">>>> After moving object back to fault, isFault is \(note.isFault)\n")
}
< /code>
1 -я попытка, по -видимому, работает, как и ожидалось, < /h2>
Наше первое выполнение, по -видимому, работает так, как и ожидалось. Мы получаем следующую журнал < /p>
>>>> This is a fault.
>>>> Read lite_title
>>>> After accessing lite_title, isFault is true
>>>> Read heavy_body
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZHEAVY_BODY, t0.ZLITE_TITLE, t0.ZUUID FROM ZNOTE t0 WHERE t0.Z_PK = ?
CoreData: details: SQLite bind[0] = (int64)1
CoreData: annotation: sql connection fetch time: 0.0003s
CoreData: annotation: fetch using NSSQLiteStatement on entity 'Note' with sql text 'SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZHEAVY_BODY, t0.ZLITE_TITLE, t0.ZUUID FROM ZNOTE t0 WHERE t0.Z_PK = ? ' returned 1 rows
CoreData: annotation: with values: (
"{Note 1-1-5 heavy_body=\"the body, which is a heavy resource\" lite_title=\"the title\" uuid=F80CE382-0345-49A0-AD34-2BAF317AB0C0 and to-manys=0x0}"
)
CoreData: annotation: total fetch execution time: 0.0006s for 1 rows.
CoreData: annotation: fault fulfilled from database for : 0xbee59927ca0b4c5b with row values: {Note 1-1-5 heavy_body="the body, which is a heavy resource" lite_title="the title" uuid=F80CE382-0345-49A0-AD34-2BAF317AB0C0 and to-manys=0x0}
>>>> After accessing heavy_body, isFault is false
>>>> After moving object back to fault, isFault is true
[*] Читать lite_title не запускает операцию sqlite db.
read_body будет инициировать операцию SQLite DB. note.managedObjectContext? Несмотря на то, что isfault < /code> возвращает True, мы можем подтвердить это, только запустив ту же функцию в течение 2 -го времени < /p>
2 -я попытка не работает < /h2>
Мы запускаем одну и ту же функцию во второй раз. Это наш журнал < /p>
Код: Выделить всё
>>>> This is a fault.
>>>> Read lite_title
>>>> After accessing lite_title, isFault is false
>>>> Read heavy_body
>>>> After accessing heavy_body, isFault is false
>>>> After moving object back to fault, isFault is true
Мы хотели бы удалить Heavy_body из памяти и оставить lite_title not to thouted для этого случая. note.lite_title и запуска запуска сбоя, только LITE_TITLE должен быть извлечен SQLite (как указано в PosterteStoFetch , мы хотим, чтобы LITE_TITLE для извлечения). Heavy_body не должен быть вынесен SQLite вдоль стороны.
Могу я узнать, как я могу достичь? https://developer.apple.com/library/arc ... quing.html (поворот объекта обратно)
Обновление по поводу отключения механизма Caching в coredata
. Dudnyk, я смог отключить механизм кэширования coredata, используя < /p>
Код: Выделить всё
container.viewContext.stalenessInterval = 0.1
< /code>
С таким кодом я могу наблюдать за Sqlite Fetch во 2 -й попытке. < /p>
>>>> This is a fault.
>>>> Read lite_title
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZHEAVY_BODY, t0.ZLITE_TITLE, t0.ZUUID FROM ZNOTE t0 WHERE t0.Z_PK = ?
CoreData: details: SQLite bind[0] = (int64)1
CoreData: annotation: sql connection fetch time: 0.0002s
CoreData: annotation: fetch using NSSQLiteStatement on entity 'Note' with sql text 'SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZHEAVY_BODY, t0.ZLITE_TITLE, t0.ZUUID FROM ZNOTE t0 WHERE t0.Z_PK = ? ' returned 1 rows
CoreData: annotation: with values: (
"{Note 1-1-6 heavy_body=\"the body, which is a heavy resource\" lite_title=\"the title\" uuid=F80CE382-0345-49A0-AD34-2BAF317AB0C0 and to-manys=0x0}"
)
CoreData: annotation: total fetch execution time: 0.0008s for 1 rows.
CoreData: annotation: fault fulfilled from database for : 0x9aff7ac6eceb6a90 with row values: {Note 1-1-6 heavy_body="the body, which is a heavy resource" lite_title="the title" uuid=F80CE382-0345-49A0-AD34-2BAF317AB0C0 and to-manys=0x0}
>>>> After accessing lite_title, isFault is false
>>>> Read heavy_body
>>>> After accessing heavy_body, isFault is false
>>>> After moving object back to fault, isFault is true
Подробнее здесь: https://stackoverflow.com/questions/708 ... ect-back-t
Мобильная версия