我希望对我的应用程序有所帮助。
我有一个设置,其中多个线程访问NSMutableDictionary
由单例类拥有的共享。线程访问字典以响应下载 JSON 并对其进行处理。单例类基本上是防止复制一些具有唯一 ID 号的下载对象。
IE。
//NSURLConnection calls:
[[Singleton sharedInstance] processJSON:data];
@interface Singleton
+ (Singleton) sharedInstance;
@property (nonatomic, strong) NSMutableDictionary *store;
@end
@implementation
-(void) processJSON:(NSData*)data {
...
someCustomClass *potentialEntry = [someCustomClass parse:data];
...
if(![self entryExists:potentialEntry.stringId])
[self addNewEntry:potentialEntry];
...
}
-(void) entryExists:(NSString*)objectId {
if(self.store[objectId])
return true;
else return false;
}
-(void) addEntry:(someCustomClass *object) {
self.store[object.stringId] = object;
}
一次可以有多达 5-10 个线程同时调用 processJSON。
不是立即,而是在运行几分钟后(在 iPhone 上比在模拟器上更快),我得到了可怕的 EXC BAD ACCESS。
我不承认知道它是如何NSMutableDictionary
工作的,但我猜背景中有某种哈希表需要在分配对象时更新并在访问对象时读取。因此,如果线程要立即读取/写入字典,则可能会发生此错误 - 可能是因为对象已在内存中移动?
我希望有更多有关该主题的知识的人可以启发我!
至于解决方案,我正在考虑具有NSOperationQueue
最大并发操作数 1 的单例类,然后operationWithBlock:
在我想访问NSDictionary
. 唯一的问题是它调用processJSON
了一个异步函数,我不能立即返回创建的对象;我必须使用一个块,这会有点混乱。有什么使用方法@synchronize
吗?那会很好用吗?