gpt4 book ai didi

ios - 主队列上的 dispatch_async block 永远不会执行

转载 作者:IT王子 更新时间:2023-10-29 08:15:13 25 4
gpt4 key购买 nike

我有一个应用程序使用连接队列来处理后台线程上的连接。每个连接发送一个 JSON post,然后当它收到成功时,将一些对象保存到 coredata 中。

所有连接完成后,我在主线程上调用 dispatch_async 来调用 finished 方法。

但是,在发送/保存数据的非常特殊的条件下,我注意到主线程的 dispatch_async block 永远不会被调用,应用程序屏幕卡住,所有执行停止,并且应用程序闲置且屏幕卡住。根据 xcode 的处理能力为 0%。

这是失败 block 的方法。

- (void)connectionDidComplete
{
_completeConnections++;

_syncProgress = (float)_completeConnections / (float)_totalConnections;

dispatch_async(mainQueue, ^(void) {
[[NSNotificationCenter defaultCenter] postNotificationName:SyncQueueDidUpdateNotification object:nil];
}); <-- this dispatch works

if (_completeConnections == _totalConnections)
{
// clear unsynced data
NSArray *syncedObjects = [SyncObject completedSyncObjects];

if (syncedObjects.count > 0)
{
for (SyncObject *syncObject in syncedObjects)
{
[syncObject delete];
}
}

//this method saves the current context, then merges this context with the main context right after
[[VS_CoreDataManager sharedManager] saveManagedObjectContextAndWait:managedObjectContext];

// cleanup the thread's context
[[VS_CoreDataManager sharedManager] unRegisterManagedObjectContextForThread:currentThread];
managedObjectContext = nil;

// complete sync
dispatch_async(mainQueue, ^(void) {
[self performSelector:@selector(finishSync) withObject:nil afterDelay:2];
}); <-- this dispatch never gets called
}
}

我怀疑这个问题与保存上下文然后合并它有关。并且可能在发生这种情况时它在合并中间被释放,导致一些奇怪的挂断并且没有执行调度。不过这只是一个猜测,我不知道如何修正它。

有什么想法吗?

谢谢。

最佳答案

如果主线程上的 block 没有被执行,那么这是因为 2 个原因中的 1 个。

  1. 主线程被阻塞;根本不处理任何事件。在主线程上有一个 while() 循环?那样就可以了。锁?好了。

  2. 主线程在外部运行循环内运行模态运行循环。在这种情况下,不会处理对主事件循环(主线程)的异步调度。

dispatch_async() 上设置断点并查看主线程在做什么(在分派(dispatch)时主线程很可能已经处于错误状态)。

DarkDust 关于使用 dispatch_after() 的建议是一个很好的建议,但不太可能奏效,因为几乎可以肯定的是,当问题发生时您的主线程没有在处理事件。 IE。解决问题,然后按照 DarkDust 的建议转到 dispatch_after()

关于ios - 主队列上的 dispatch_async block 永远不会执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21120035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com