gpt4 book ai didi

objective-c - GCD和可变对象

转载 作者:行者123 更新时间:2023-12-01 19:24:33 24 4
gpt4 key购买 nike

我有一个单例数据管理器对象,该对象管理与Web服务的连接,处理数据,然后使用对象更新可变的字典。对字典的所有请求都是通过我创建的这个单例实例进行的。我会一次又一次地遇到冲突,因为我显然是在许多线程中编辑可变对象,因此偶尔会得到EXC_BAD_ACCESS。

我可以实现@synchronized方法或使用NSLock,但是由于我已经大量使用了Grand Central Dispatch,所以我想知道是否有什么可以通过将它们全部强制向下同步到一个线程来完成的?我也不确定上述方法是否有效以及如何实现。

下面的示例代码。在getObjectArray方法中可能会发生异常,因为我可能会向它添加/更新子对象/在translateToObjectFromDict方法中删除。

NSMutableDictionary *staticDictionary;

-(NSArray *)getObjectArray{

NSArray *returnArray = [[[NSArray alloc]init]autorelease];
returnArray = [self.staticDictionary allValues];
return returnArray;
}

-(void)translateToObjectFromDict:(NSDictionary *)sourceDictionary{



dispatch_group_t taskGroup = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(0,0);


dispatch_group_async(taskGroup,queue,^(){

for (id key in sourceDictionary) {
NSDictionary *subDictionary = [sourceDictionary objectForKey:key];
for (id key in subDictionary) {

NSArray *theObjData = [subDictionary objectForKey:key];
if ([theObjData count] == 12) {

theObj *temptheObj = [[PINKtheObj alloc] initWith......
NSString *unihex = temptheObj.unihex;

if ([self.staticDictionary objectForKey:unihex]){
PINKtheObj *localtheObj = [self.staticDictionary objectForKey:unihex];
if (temptheObj.time > localtheObj.time) {
[localtheObj updatetheObjWith.......
[temptheObj release];
}else{
[self.staticDictionary setObject:temptheObj forKey:unihex];
}
}

}
}
});

dispatch_group_notify(taskGroup, queue, ^{
NSDictionary *getMainDict = [self.mainDictionary objectForKey:@"theObjs"];

for (id key in self.staticDictionary) {
if (![getMainDict objectForKey:key]){
[self.removeArray addObject:[self.staticDictionary objectForKey:key]];
}
}

[[NSNotificationCenter defaultCenter]postNotificationName:@"updated" object:nil];
});
dispatch_release(taskGroup);

}

最佳答案

我认为您应该在自己的串行队列中向objectForKey:提供所有调用(setObject:ForKey:staticDictionary等)。单例初始化时创建它,并在各处使用。
在头文件中创建ivar。

dispatch_queue_t queueDict;

在.m文件中,只需添加到 init
queueDict = dispatch_queue_create("com.yourid.yoursingleton.queueDict ", NULL);

当您想访问数据或将数据放入字典时,只需
dispatch_async(queueDict, ^(){
[staticDict setObject:obj forKey:key]; //example
}

如果希望任务等待返回值,则可以使用 dispatch_sync
__block id returnValue;
dispatch_sync(queueDict, ^(){
returnValue = [statictDict objectForKey:key]; //example
}
obj = returnValue;

关于objective-c - GCD和可变对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8487276/

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