1

我正在尝试创建一个具有多线程和核心数据的示例应用程序,该应用程序可能会崩溃或陷入死锁。

我创建了一个并发队列并使用 for 循环调用 dispatch_async 三次。

     AppDelegate *appDelegate = (AppDelegate *)[[UIApplication       sharedApplication] delegate];
NSManagedObjectContext *aMangedObjectContext = appDelegate.managedObjectContext;

for (int i = 0; i<=2; i++) {     

    LibXMLParser *parser = [[parserClass alloc] init];
    parser.delegate = self;
    dispatch_async(_queue, ^{
        [parser startWithContext:aMangedObjectContext];

    });
}

//我添加了另一个并发队列只是为了看看它是否崩溃,但没有运气

    for (int i = 0; i<=2; i++) {
    LibXMLParser *parser = [[parserClass alloc] init];
    parser.delegate = self;
    dispatch_async(dispatch_get_main_queue(), ^{
        [parser startWithContext:aMangedObjectContext];

    });
}

我使用这种技术创建并发队列:

@property (nonatomic) dispatch_queue_t queue;
@property (nonatomic) dispatch_queue_t queue;

_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
_queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

我在主要上下文中保存数据:

 AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *aMangedObjectContext = appDelegate.managedObjectContext;
NSError *error = nil;
 if (![aManagedObjectContext save:&error]) {
    NSLog(@"Error in adding a new bank %@, %@", error, [error userInfo]);
    abort();
}

这里 m 使用在我的应用程序委托中在不同线程中创建的相同主上下文。而且由于这破坏了核心数据中的包含模型,(每个线程都应该有自己的私有上下文)我的应用程序不应该生成正确的输出。

该应用程序在每个 dispatch_async 中获得前 100 首歌曲。所以我总共得到了 300 首歌曲。

我也没有将我的应用程序注册到 NSManagedObjectContextDidSaveNotification,因为我只使用了主上下文而不是多个上下文。每次 save 在它自己的主上下文的不同线程中调用。

我只是不明白为什么我的应用程序既没有死锁也没有崩溃。

谁能告诉我哪里出错了。

当我在不同的线程中使用一个上下文时,我只希望我的应用程序在多个线程中使用相同的对象上下文时崩溃或冻结。

有人可以告诉我在什么情况下一个队列会同时访问相同的上下文。我应该创建另一个并发队列吗?我试过了,但没有用。

谢谢你。

4

0 回答 0