gpt4 book ai didi

objective-c - 调度队列是如何工作的

转载 作者:太空狗 更新时间:2023-10-30 03:49:04 25 4
gpt4 key购买 nike

我在这里有点困惑,我在使用队列,我到了有点迷路的地步。

我有一个名为 getPeople 的方法,它必须从服务器获取用户的照片。为了不阻止应用程序,我使用了这个:

 -(IBAction)seeMorePeople{
dispatch_queue_t getPeopleQueue = dispatch_queue_create("Pinta Ocupantes", NULL);
dispatch_async(getPeopleQueue, ^{
[self getPeople];
});
dispatch_release(getPeopleQueue);
}

每次用户点击按钮时,都会执行前面的代码。诸如“给我这张专辑中的照片”之类的东西,然后再点击“现在我想要其他专辑中的人的照片”,不同的图片和不同数量的图片。如果用户快速点击按钮,当第二个队列已经开始时,第一个队列不会完成获取数据。在 getPeople 中,我将数据存储在 NSMutableArray 中,因此当两个队列同时执行时,两者都在同一个数组上写入,并且应用程序由于越界异常而崩溃。getPeople 处理数据的方式是这样的:

-(void)getPeople:(NSDictionary *)peopleDictionary{
//I receive an NSDictionary and I go through it
NSArray *keys = [peopleDictionary allKeys];
int indexOfArray = 0;
for(NSString *key in keys){
//Complex operation that are not important
[peopleInArray insertObjetAtIndex:indexOfArray];//People in array is a global variable
indexOfArray++;
}
}

我想不通的是如何摆脱这个,我想在第二个队列进来时停止第一个队列,但是 GCD 没有这个选项......希望有任何其他方法来完成这个没有重大的重新编码,无论如何我现在没有想法,所以任何线索都会有所帮助。

最佳答案

我建议您尽可能避免与信号量同步。 GCD 的设计就是为了避免这种情况。后台任务应该准备数据但不接触外部状态。准备好数据后,它应该将外部状态的更新分派(dispatch)到串行队列,或者,如果状态绑定(bind)到 GUI,则分派(dispatch)到主队列。

所以,像这样:

-(void)getPeople:(NSDictionary *)peopleDictionary{
//I receive an NSDictionary and I go through it
NSArray *keys = [peopleDictionary allKeys];
for(NSString *key in keys){
//Complex operation that are not important
dispatch_async(dispatch_get_main_queue(), ^{
[peopleInArray addObject:<whatever>];
});
}
}

如果你更愿意替换数组,而不是让两个线程以交错的方式添加到它,你可以在后台累积整个数组并将整个 peopleInArray 设置为主队列。

如果你想取消,你可以自己用一个标志来实现它,或者你应该考虑使用 NSOperationNSOperationQueue 而不是 GCD。它们具有内置的取消概念,但您的自定义操作仍需要检查它们是否已被取消并停止工作。

关于objective-c - 调度队列是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10109577/

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