我的应用程序效率低下,我想了解并修复.
我的算法是:
fetch object collection from network
for each object:
if (corresponding locally stored object not found): -- A
create object
if (a nested related object locally not found): -- B
create a related object
Run Code Online (Sandbox Code Playgroud)
我正在通过使用相关对象的键创建谓词查询来检查A行和B行,该键是我的模式的一部分.我看到A(总是)和B(如果执行分支到该部分)生成一个SQL选择,如:
2010-02-05 01:57:51.092 app[393:207] CoreData: sql: SELECT <a bunch of fields> FROM ZTABLE1 t0 WHERE t0.ZID = ?
2010-02-05 01:57:51.097 app[393:207] CoreData: annotation: sql connection fetch time: 0.0046s
2010-02-05 01:57:51.100 app[393:207] CoreData: annotation: total fetch execution time: 0.0074s for 0 rows.
2010-02-05 01:57:51.125 app[393:207] CoreData: …Run Code Online (Sandbox Code Playgroud) iphone performance core-data nsfetchrequest cocoa-design-patterns
我有一个UITableView人口NSFetchedResultsController.初始提取工作正常.我可以添加,删除,修改等零问题.但我想在表中添加用户定义的排序.我这样做是通过改变NSFetchedResultsController使用不同的sortDescriptor设置和不同的设置sectionNameKeyPath.这是我更改提取的代码:
-(void)changeFetchData {
fetchedResultsController = nil;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSString *sortKey = @"sortKey";
NSString *cacheName = @"myNewCache";
BOOL ascending = YES;
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortKey ascending:ascending];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:sortKey cacheName:nil];
self.fetchedResultsController = aFetchedResultsController;
fetchedResultsController.delegate = self;
[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors …Run Code Online (Sandbox Code Playgroud) iphone objective-c uitableview nsfetchedresultscontroller nsfetchrequest
我使用NSFetchResultsController在UITableView中显示100,000 +记录.这有效,但它很慢,特别是在iPad 1上.加载可能需要7秒钟,这对我的用户来说是一种折磨.
我也希望能够使用部分,但这至少会增加3秒的时间.
这是我的NSFetchResultsController:
- (NSFetchedResultsController *)fetchedResultsController {
if (self.clientsController != nil) {
return self.clientsController;
}
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Client" inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];
[request setPredicate:[NSPredicate predicateWithFormat:@"ManufacturerID==%@", self.manufacturerID]];
[request setFetchBatchSize:25];
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"UDF1" ascending:YES];
NSSortDescriptor *sort2= [[NSSortDescriptor alloc] initWithKey:@"Name" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObjects:sort, sort2,nil]];
NSArray *propertiesToFetch = [[NSArray alloc] initWithObjects:@"Name", @"ManufacturerID",@"CustomerNumber",@"City", @"StateProvince",@"PostalCode",@"UDF1",@"UDF2", nil];
[request setPropertiesToFetch:propertiesToFetch];
self.clientsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil
cacheName:nil];
return self.clientsController;
}
Run Code Online (Sandbox Code Playgroud)
我有一个在我的NSPredicate中使用的ManufacturerID索引.这看起来像一个非常基本的NSFetchRequest - 我能做些什么来加快这个速度?或者我刚刚达到了限制?我肯定错过了什么.
我有一个获取请求,该请求可以产生一个包含结果中两个部分的tableview.
我的模特:
@interface Player : NSManagedObject
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * isFacebookFriend;
Run Code Online (Sandbox Code Playgroud)
此模型上的获取请求应该生成一个部分,其中一个部分中的isFacebookFriend == YES,而第二部分中的isFacebookFriend == NO.
我试过了
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
HBAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Player" inManagedObjectContext:appDelegate.managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *nameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
[fetchRequest setSortDescriptors:@[nameDescriptor]];
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setPropertiesToGroupBy:@[@"isFacebookFriend"]];
_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:appDelegate.managedObjectContext sectionNameKeyPath:nil cacheName:@"playerCache"];
NSError *error;
[_fetchedResultsController performFetch:&error];
Run Code Online (Sandbox Code Playgroud)
但那没有做到.错误是:
2013-06-12 12:27:28.364 TwentyQuestions[25015:c07] Unbalanced calls to begin/end appearance transitions for <UINavigationController: …Run Code Online (Sandbox Code Playgroud) 我是iOS开发的新出价.我正在使用NSManagedObject of Core Data来执行Insert和Fetch操作.它工作得很好.但问题是,我想从表中只获取一些选定的记录(在MySQL中的条件).例如"从city ='Pune'的用户中选择名称"; 我找到了NSPredicate来获取过滤后的数据.但它提供了数组中的所有数据,而不仅仅是所选数据.例如,如果以上查询的结果是:
Anu
Run Code Online (Sandbox Code Playgroud)
然后NSPredicate结果将给出:
fname = Anu
lname = Padhye
city = Pune
id = 3
Run Code Online (Sandbox Code Playgroud)
有没有办法只在iOS Objective-c中获取所选的记录?以下是我用于NSManagedObject的代码片段:
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"User"];
valueData = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
NSEntityDescription *productEntity=[NSEntityDescription entityForName:@"User" inManagedObjectContext:managedObjectContext];
NSFetchRequest *fetch=[[NSFetchRequest alloc] init];
[fetch setEntity:productEntity];
NSPredicate *p=[NSPredicate predicateWithFormat:@"id == %d", 3];
[fetch setPredicate:p];
//... add sorts if you want them
NSError *fetchError;
NSArray *fetchedProducts=[valueData filteredArrayUsingPredicate:p];
Run Code Online (Sandbox Code Playgroud) 我正在使用带有Swift 2.1和Xcode 7.2的Core数据.这段代码给了我一个无法找到实体名称的错误.这个[公司]不起作用.我有一个具有此名称的实体.
let fetchRequest = NSFetchRequest(entityName: "Company")
do {
var result = try self.moc.executeFetchRequest(fetchRequest) as! [Company]
if (result.count > 0){
companyName?.stringValue = result[0].valueForKeyPath("name") as! String
// success ...
}
else{
}
} catch let error as NSError {
// failure
print("Fetch failed: \(error.localizedDescription)")
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试获取父母的所有孩子。
在我的例子中,父对象是一个实体 AgendaEvent,它有许多 AgendaDate(子对象)。
所以这是我的功能:
func getRelatedAgendaEvent(event: AgendaEvent) ->NSFetchRequest<AgendaDate> {
// create a fetch request that will retrieve all the AgendaDate.
let fetchRquest = NSFetchRequest<AgendaDate>(entityName: "AgendaDate")
// set the predicate to only keep AgendaDate related with the AgendaEvent selected
fetchRquest.predicate = NSPredicate(format: "parent == %@", event)
return fetchRquest
}
Run Code Online (Sandbox Code Playgroud)
我在 didselectRow 中使用它作为 tableView:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
var eventToPass: AgendaEvent!
var eventDateToPassArray: [AgendaDate]!
eventToPass = myTempEvents[indexPath.row]
eventDateToPassArray = try! context.fetch(getRelatedAgendaEvent(event: eventToPass))
DispatchQueue.main.async { () -> Void …Run Code Online (Sandbox Code Playgroud) 在 Swift 4 中,我有一个 CoreData“Sentence”模型,它有一个字符串属性“englishsentence”。我还有一个“单词”数组,并希望获取“englishsentence”属性包含数组中一个或多个单词的所有句子。
var words = ["today", "yesterday", "tomorrow"]
Run Code Online (Sandbox Code Playgroud)
这个数组只是一个例子。它应该在运行时改变并且可以有任何长度。
在 fetch 请求中,我试图做这样的事情:
let fetchRequest =
NSFetchRequest<NSManagedObject>(entityName: "Sentence")
let predicate = NSPredicate(format: "ANY englishsentence CONTAINS ANY word IN %@", words)
fetchRequest.predicate = predicate
Run Code Online (Sandbox Code Playgroud)
我能够为包含一个特定单词的所有句子创建一个谓词。但是,我无法让它与单词数组一起工作,除非我遍历单词数组并为每个单词发出新的获取请求。但这似乎非常低效。
我在 NSFetchedResultsController 中遇到了 fetchBatchSize 问题,所以我决定退后一步,只在普通的 NSFetchRequest 上使用它。我创建了一个非常简单的项目,其中只有一个包含 100 个项目的 tableViewController。项目只有两个属性,itemID 和 itemName。我使用以下方法填充数据数组:
func initializeItems() {
let request = NSFetchRequest<Item>(entityName: "Item")
let messageSort = NSSortDescriptor(key: "itemName", ascending: true)
request.sortDescriptors = [messageSort]
request.fetchBatchSize = 20
do {
let fetchedResults = try context.fetch(request)
if fetchedResults.count > 0 {
self.items = fetchedResults
//self.tableView.reloadData()
}
} catch {
print("Could not fetch \(error)")
}
}
Run Code Online (Sandbox Code Playgroud)
这在 tableViewController 的 viewDidLoad 中调用。上下文定义如下:
let appDelegate = UIApplication.shared.delegate as! AppDelegate
self.context = appDelegate.persistentContainer.viewContext
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序时,表格显示所有行都已完全填充(如滚动条所示)。
我不明白为什么 fetchBatchSize 被忽略了。
文档如下:
提取请求中指定的对象的批量大小。默认值为 0。批量大小为 …
我正在构建一个 SwiftUI 应用程序,它显示一个包含相关日期和持续时间的值列表。目前ContentView只是列出所有值(日期升序)。
我想要实现的是,实体按日期分组并放入其相关部分,例如:
当前的
目的
非常感谢任何帮助,非常感谢。
代码
// MARK: - ContentView
struct ContentView: View {
// MARK: - Variables
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(fetchRequest: EntityCore.fetch()) var entities
// MARK: - Body
var body: …Run Code Online (Sandbox Code Playgroud) nsfetchrequest ×10
core-data ×8
ios ×5
swift ×4
iphone ×2
entity ×1
ipad ×1
objective-c ×1
performance ×1
predicate ×1
swiftui ×1
uitableview ×1
xcode ×1