【问题标题】:Application freeze while executing fetch request执行获取请求时应用程序冻结
【发布时间】:2013-06-25 14:29:24
【问题描述】:

在我的应用程序中,在执行获取请求时,应用程序会随机冻结。我已经尝试过多个选择,例如 @synchronized 和 performblock 仍然挂起。下面是我的第一个获取请求块。应用程序在此获取请求中随机挂起。

+(BXXXX *)getDetailsById:(NSNumber *)Id
    {
        NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
        NSEntityDescription *entityDescription = [NSEntityDescription

                                                  entityForName:@"BXXXX"  inManagedObjectContext:[SDataManager managedObjectContext]];
        [fetch setEntity:entityDescription];
        [fetch setPredicate:[NSPredicate predicateWithFormat:
                             @"(BId = %@)",Id]];


        __block NSArray *bDetails;
        [[SDataManager managedObjectContext] performBlockAndWait:^{
            NSError *error = nil;
            bDetails = [[SDataManager managedObjectContext] executeFetchRequest:fetch error:&error];

        }];

        if([bDetails count] == 1)
            return [bDetails objectAtIndex:0];
        else
            return nil;

    }

//我的托管对象上下文声明

+(NSManagedObjectContext *)managedObjectContext
{
    static NSManagedObjectContext *managedObjectContext;
    if(managedObjectContext!=nil){
        return managedObjectContext;
    }
    @try { 
        NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
        if (coordinator != nil) {
            managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
            [managedObjectContext setPersistentStoreCoordinator: coordinator];
        }
    }
    @catch (NSException *exception) {
        NSLog(@"Exception occur %@",exception);
    }
        return managedObjectContext;

}

请指导我解决此问题。我很努力,但我现在仍然无法解决这个问题。

【问题讨论】:

  • 不要在方法前面加上get;它是为特殊目的而保留的,但事实并非如此。

标签: ios objective-c core-data nsmanagedobjectcontext executefetchrequest


【解决方案1】:
        managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];

您的托管对象上下文将在主队列上完成所有工作。这将阻塞主事件循环并导致您的应用程序似乎挂起。

将工作移出主队列。请参阅Core Data Concurrency Guide

【讨论】:

  • +1 感谢您建议我的 bbum 文档非常有用。
【解决方案2】:
I have fixed this issue by creating two managed object context like this.
// Base
    +(NSManagedObjectContext *)managedObjectContext
    {
        static NSManagedObjectContext *managedObjectContext;
        if(managedObjectContext!=nil){
            return managedObjectContext;
        }
        @try { 
            NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
            if (coordinator != nil) {
                managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
                [managedObjectContext setPersistentStoreCoordinator: coordinator];
            }
        }
        @catch (NSException *exception) {
            NSLog(@"Exception occur %@",exception);
        }
            return managedObjectContext;

    }

//Child

    +(NSManagedObjectContext *)childManagedObjectContext
    {
        static NSManagedObjectContext *managedObjectContext;
        if(managedObjectContext!=nil){
            return managedObjectContext;
        }
        @try {
            NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
            if (coordinator != nil) {
                managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
                [managedObjectContext setPersistentStoreCoordinator: coordinator];
            }
        }
        @catch (NSException *exception) {
            NSLog(@"Exception occur %@",exception);
        }
        return managedObjectContext;

    }

为了执行获取请求,我使用了并发类型为 NSPrivateQueueConcurrencyType 的子托管对象上下文。它对我来说很好。现在 UI 挂起不存在。

【讨论】:

    猜你喜欢
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多