CoreDataEnvir (since 2011-05-25) последняя версия 0.4
CoreDataEnvir — это оболочка CoreData-фреймворка. Она предоставляет простой способ использования CoreData и обеспечивает поддержку безопасности потоков для параллельного программирования. Вы можете запускать отдельный экземпляр на каждом потоке для параллельной работы.
Регистрация имени файла вашей базы данных:
[CoreDataEnvir registDatabaseFileName:@"db.sqlite"];
Регистрация имени вашего файла модели (без расширения файла):
[CoreDataEnvir registModelFileName:@"SampleModel"];
Предположим, что класс Book в вашем приложении представляет объект книги. У него есть некоторые атрибуты, такие как name, author и другие. Также есть автор по имени «Джон Стефен», который написал книгу «Наполеон».
[Book insertItemWithFillingBlock:^(id item) {
item.name = @"Джон Стефен";
item.author = @"Наполеон";
}];
//Запрос книг, написанных Джоном Стефеном
NSArray *books= [Feed itemsWithFormat:@"author = %@", @"Джон Стефен"];
//Поиск книги «Наполеон», написанной Джоном Стефеном
Book *book = [Book lastItemWithFormat:@"name = %@ && author = %@", @"Наполеон", @"Джон Стефен"];
[CoreDataEnvir asyncMainInBlock:^(CoreDataEnvir *db) {
[db deleteDataItem:book];
}];
[CoreDataEnvir asyncMainInBlock:^(CoreDataEnvir *db) {
[db deleteDataItemSet:books];
}];
Вы можете выполнять лёгкие операции в основном потоке, но лучше не влиять на реакцию пользовательского интерфейса. Все операции с данными, описанные выше, должны выполняться в основном потоке. В противном случае CoreDataEnvir автоматически вызовет исключение. Поэтому вам следует быть внимательным при использовании этого фреймворка, если вы не уверены, является ли текущий поток основным, можно сделать следующее:
[CoreDataEnvir asyncMainInBlock:^(CoreDataEnvir *db) {
[Book insertItemWithFillingBlock:^(id item) {
item.name = @"Наполеон";
item.author = @"Джон Стефен";
}];
}];
CoreDataEnvir также предоставляет фоновый GCD-очередь для вашего использования. Block asyncBackgroundInBlock будет автоматически сохранять изменения в базе данных после завершения вызова void(^)(CoreDataEnvir *db). Вам не нужно вызывать [db saveDataBase] напрямую, как в старых версиях.
[CoreDataEnvir asyncBackgroundInBlock:^(CoreDataEnvir *db) {
[Book insertItemOnBackgroundWithFillingBlock:^(id item) {
item.name = @"Наполеон";
item.author = @"Джон Стефен";
}];
}];
Таким образом, использование CoreData становится более удобным в параллельном программировании.
Должны выполняться в основной GCD-очереди:
+ (void)asyncMainInBlock:(void(^)(CoreDataEnvir *db))CoreDataBlock;
+ (id)insertItemWithFillingBlock:(void(^)(id item))fillingBlock;
+ (NSArray *)itemsWithFormat:(NSString *)fmt,...;
...Должны выполняться в фоновой GCD-очереди. Вы можете использовать API, содержащие Background в названии:
+ (void)asyncBackgroundInBlock:(void(^)(CoreDataEnvir *db))CoreDataBlock;
+ (id)insertItemOnBackgroundWithFillingBlock:(void(^)(id item))fillingBlock;
+ (NSArray *)itemsOnBackgroundWithFormat:(NSString *)fmt,...;
...Или вы можете выбрать выполнение в собственной GCD-очереди, используя следующие API:
+ (CoreDataEnvir *)createInstance;
рекомендуется сохранить этот экземпляр для будущего использования.- (void)asyncInBlock:(void(^)(CoreDataEnvir *db))CoreDataBlock;
Если вы планируете использовать свои NSManagedObject-объекты в будущем, не освобождайте объект CoreDataEnvir, иначе все модели объектов станут недействительными.
При работе с базой данных в многопоточной среде убедитесь, что каждый поток имеет свой собственный NSManagedObjectContext-объект.
PS: В CoreDataEnvir убедитесь, что ваши NSManagedObject-объекты получены из основного потока через [CoreDataEnvir mainInstance] или из фонового потока через [CoreDataEnvir backgroundInstance]. Эти два объекта не будут освобождены, обычно CoreDataEnvir предоставляет два потока, которые могут справиться с обычными параллельными ситуациями.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )