Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c iOS应用程序冻结,但不会';不要撞车?_Objective C_Ios_Core Data_Nspredicate - Fatal编程技术网

Objective c iOS应用程序冻结,但不会';不要撞车?

Objective c iOS应用程序冻结,但不会';不要撞车?,objective-c,ios,core-data,nspredicate,Objective C,Ios,Core Data,Nspredicate,因此,我的应用程序冻结,无法响应触摸事件。它不会崩溃,只是坐在那里 如果我按下暂停按钮| |,它将在下面的代码行中停止 NSArray *results = [context executeFetchRequest:request error:&error]; 如果我按下play,该应用程序仍然冻结,如果我再次按下pause,它仍然指向上面的代码行 NSArray *results = [context executeFetchRequest:request error:&

因此,我的应用程序冻结,无法响应触摸事件。它不会崩溃,只是坐在那里

如果我按下暂停按钮| |,它将在下面的代码行中停止

 NSArray *results = [context executeFetchRequest:request error:&error];
如果我按下play,该应用程序仍然冻结,如果我再次按下pause,它仍然指向上面的代码行

 NSArray *results = [context executeFetchRequest:request error:&error];
下面是它暂停的完整代码

NSManagedObjectContext *context = [NSManagedObjectContext contextForCurrentThread];
NSEntityDescription *entity = [self entityDescriptionInContext:context];
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:[entity name]];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(thingId like[c] %@)", sessionID];
[request setPredicate:predicate];

NSError *error = nil;
NSArray *results = [context executeFetchRequest:request error:&error];  **<-- Pause lands me here**

if (!results || error || 0 == results.count){
    return nil;
}

return [results objectAtIndex:0];
NSManagedObjectContext*context=[NSManagedObjectContext contextForCurrentThread];
NSEntityDescription*实体=[self-entityDescriptionInContext:context];
NSFetchRequest*request=[NSFetchRequest fetchRequestWithEntityName:[实体名称]];
NSPredicate*谓词=[NSPredicate谓词格式:@“(thingId like[c]@)”,sessionID];
[请求集谓词:谓词];
n错误*错误=nil;

NSArray*results=[context executeFetchRequest:request error:&error]** 您正在执行的查询很可能要经过很多记录,并且需要很长时间才能获得这些记录。尝试在后台线程中进行该提取,并将记录的objectid移动到主线程。应用程序不会崩溃,因为此时正在运行调试器。如果直接从设备而不是从Xcode运行应用程序,很可能会发生崩溃。

找到了答案,我不再使用“LIKE[c]”,而是改用“==”。在获取任何内容时,我也不再在应用程序中使用[AppDelegate managedObjectContext],而是使用contextForCurrentThread


通过执行这两项操作,我的应用程序已停止冻结。

您能否至少向我们展示一下如何设置提取请求?另外,您的数据存储有多大?很难确切知道,但它看起来不像[c],而是您想要使用==。另外,如果你只想返回一个对象,你应该设置一个获取限制。这个应用程序有线程吗?我曾看到,在创建托管对象上下文的队列中意外误用托管对象上下文会导致死锁。您能否向我们展示完全扩展的堆栈跟踪,包括它返回的内部系统调用名?什么是contextForCurrentThread?它的Restkit。它获取当前线程的managedObjectContext,因此如果在NSManagedObject中搜索时使用currentThread,则不会在主线程上搜索。什么是“将记录的objectID移动到主线程”?您有一个具体的例子吗?在您的数据模型中将
thingId
作为索引属性也会使您受益匪浅。这将加快抓取速度,但会稍微增加将对象添加到存储的时间。