deleteObject挂起我的应用程序

时间:2015-11-05 05:58:55

标签: ios objective-c

TTNetworkDataSource* netSource = [TTNetworkDataSource sharedSource];
    [netSource setContext:self];

    TTDataSourceResponse* districtsResponse = [netSource requestDataWithQuery:@{@(OBJECT_TYPE): [HotlineDistrict clsName]}];


    if (districtsResponse != nil) {
        NSArray* objects = [self executeFetchRequestUnsafe:[NSFetchRequest fetchRequestWithEntityName:[HotlineDistrict clsName]] error:&localError];

        NSInteger i = 0;

        if (localError != nil) {
            result = NO; return;
        } else {
            NSLog(@"%lu = fetchedObjects, %lu = districtsResponse", (unsigned long)objects.count, (unsigned long)districtsResponse.objects.count);
            for (NSManagedObject* obj in objects) {
                NSLog(@"Deleted Objects in fetched objects %ld", (unsigned long)i++);
                [self deleteObject:obj];
            }

            for (NSManagedObject* obj in districtsResponse.objects) {
                NSLog(@"Inserted Object in districtsResponse %ld", (unsigned long)i++);
                [self insertObject:obj];
            }
        }
    } else {
        localError = [NSError errorInfo:@{NSLocalizedDescriptionKey: @"Error when getting districts."}];
        result = NO;
    }

    TTDataSourceResponse* requestTypeResponse = [netSource requestDataWithQuery:@{@(OBJECT_TYPE): [HotlineRequestType clsName]}];


    if (requestTypeResponse != nil) {
        NSArray* objects = [self executeFetchRequestUnsafe:[NSFetchRequest fetchRequestWithEntityName:[HotlineRequestType clsName]] error:&localError];

        NSInteger j = 0;

        if (localError != nil) {
            result = NO; return;
        } else {
            NSLog(@"%lu = fetchedObjects, %lu = requestTypeResponse", (unsigned long)objects.count, (unsigned long)requestTypeResponse.objects.count);
            for (NSManagedObject* obj in objects) {
                NSLog(@"Deleted Objects in fetched objects %ld", (unsigned long)j++);
                [self deleteObject:obj];
            }

            for (NSManagedObject* obj in requestTypeResponse.objects) {
                NSLog(@"Deleted Objects in requestTypeResponse %ld", (unsigned long)j++);
                [self insertObject:obj];
            }
        }
    } else {
        localError = [NSError errorInfo:@{NSLocalizedDescriptionKey: @"Error when getting request types."}];
        result = NO;
    }

这是我的代码,在[self deleteObject:obj]我的应用程序挂起

之后

手动调试:

NSLog(@"%lu = fetchedObjects, %lu = districtsResponse", (unsigned long)objects.count, (unsigned long)districtsResponse.objects.count);

给出这个结果:

  

802 = fetchedObjects,47 = districtsResponse

NSLogs in循环给出对象的枚举,总共我们有fetchedObjects和districtsResponse的summ,即使将NSLog放在循环体的末尾。所以它说循环结束了。但该应用程序挂起。那些循环2,它不接触第二个循环,如果我们用deleteObject删除那些循环 - 它可以工作。

2 个答案:

答案 0 :(得分:0)

你不能像NS所说的那样继承NSManagedObjectContext:

https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/index.html

子类注释 强烈建议您不要继承NSManagedObjectContext。变更跟踪和撤消管理机制经过高度优化,因而错综复杂。插入可能影响processPendingChanges的额外逻辑可能会产生无法预料的后果。在商店迁移等情况下,Core Data将创建NSManagedObjectContext的实例供自己使用。在这些情况下,您不能依赖自定义子类的任何功能。任何NSManagedObject子类必须始终与NSManagedObjectContext完全兼容(也就是说,它不能依赖NSManagedObjectContext的子类的功能)。

答案 1 :(得分:0)

我找到了答案,我们在实体中给出了所需属性的nil值,但无论如何,非常感谢你们