Skip to content

Commit 246d107

Browse files
修复 遍历Array 的线程安全问题
1 parent 399cce0 commit 246d107

File tree

2 files changed

+33
-30
lines changed

2 files changed

+33
-30
lines changed

LKDBHelper.podspec.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "LKDBHelper",
3-
"version": "2.4.7",
3+
"version": "2.5.1",
44
"summary": "全自动的插入,查询,更新,删除, an automatic database operation thread-safe and not afraid of recursive deadlock",
55
"description": "全面支持 NSArray,NSDictionary, ModelClass, NSNumber, NSString, NSDate, NSData, UIColor, UIImage, CGRect, CGPoint, CGSize, NSRange, int,char,float, double, long.. 等属性的自动化操作(插入和查询)",
66
"homepage": "https://github.com/li6185377/LKDBHelper-SQLite-ORM",
@@ -10,7 +10,7 @@
1010
},
1111
"source": {
1212
"git": "https://github.com/li6185377/LKDBHelper-SQLite-ORM.git",
13-
"tag": "2.4.7"
13+
"tag": "2.5.1"
1414
},
1515
"platforms": {
1616
"ios": "5.0",

LKDBHelper/Helper/LKDBHelper.m

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,7 @@ + (void)setLogError:(BOOL)logError
7878
#ifdef DEBUG
7979
LKDBLogErrorEnable = logError;
8080
NSMutableArray *dbArray = [self dbHelperSingleArray];
81-
@synchronized(dbArray)
82-
{
81+
@synchronized(dbArray) {
8382
[dbArray enumerateObjectsUsingBlock:^(LKDBWeakObject *weakObj, NSUInteger idx, BOOL *stop) {
8483
[weakObj.obj executeDB:^(FMDatabase *db) {
8584
db.logsErrors = LKDBLogErrorEnable;
@@ -100,7 +99,7 @@ + (BOOL)nullIsEmpty
10099

101100
+ (NSMutableArray *)dbHelperSingleArray
102101
{
103-
static __strong NSMutableArray *dbArray;
102+
static NSMutableArray *dbArray;
104103
static dispatch_once_t onceToken;
105104
dispatch_once(&onceToken, ^{
106105
dbArray = [NSMutableArray array];
@@ -110,32 +109,33 @@ + (NSMutableArray *)dbHelperSingleArray
110109

111110
+ (LKDBHelper *)dbHelperWithPath:(NSString *)dbFilePath save:(LKDBHelper *)helper
112111
{
113-
NSMutableArray *dbArray = [self dbHelperSingleArray];
114112
LKDBHelper *instance = nil;
115113
dbFilePath = dbFilePath.lowercaseString;
116114

117115
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
118116
BOOL hasCached = NO;
119117

120-
for (NSInteger i = 0; i < dbArray.count; i++) {
121-
LKDBWeakObject *weakObj = [dbArray objectAtIndex:i];
122-
if ([weakObj.obj.dbPath.lowercaseString isEqualToString:dbFilePath]) {
123-
if (helper) {
124-
hasCached = YES;
125-
} else {
126-
instance = weakObj.obj;
118+
NSMutableArray *dbArray = [self dbHelperSingleArray];
119+
@synchronized(dbArray) {
120+
for (NSInteger i = 0; i < dbArray.count; i++) {
121+
LKDBWeakObject *weakObj = [dbArray objectAtIndex:i];
122+
if ([weakObj.obj.dbPath.lowercaseString isEqualToString:dbFilePath]) {
123+
if (helper) {
124+
hasCached = YES;
125+
} else {
126+
instance = weakObj.obj;
127+
}
128+
} else if (!weakObj.obj){
129+
[indexSet addIndex:i];
127130
}
128-
} else if (!weakObj.obj){
129-
[indexSet addIndex:i];
130131
}
131-
}
132-
133-
[dbArray removeObjectsAtIndexes:indexSet];
134-
135-
if (!hasCached && helper) {
136-
LKDBWeakObject *weakObj = [[LKDBWeakObject alloc] init];
137-
weakObj.obj = helper;
138-
[dbArray addObject:weakObj];
132+
[dbArray removeObjectsAtIndexes:indexSet];
133+
134+
if (!hasCached && helper) {
135+
LKDBWeakObject *weakObj = [[LKDBWeakObject alloc] init];
136+
weakObj.obj = helper;
137+
[dbArray addObject:weakObj];
138+
}
139139
}
140140

141141
return instance;
@@ -525,16 +525,19 @@ - (NSString *)encryptionKey
525525
#pragma mark - dealloc
526526
- (void)dealloc
527527
{
528-
NSArray *array = [LKDBHelper dbHelperSingleArray];
529-
@synchronized(array)
530-
{
531-
for (LKDBWeakObject *weakObject in array) {
532-
if ([weakObject.obj isEqual:self]) {
533-
weakObject.obj = nil;
528+
NSMutableArray *dbArray = [LKDBHelper dbHelperSingleArray];
529+
@synchronized(dbArray) {
530+
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
531+
for (NSInteger i = 0; i < dbArray.count; i++) {
532+
LKDBWeakObject *weakObj = [dbArray objectAtIndex:i];
533+
if (weakObj.obj == self){
534+
weakObj.obj = nil;
535+
[indexSet addIndex:i];
534536
}
535537
}
538+
[dbArray removeObjectsAtIndexes:indexSet];
536539
}
537-
540+
538541
[self.bindingQueue close];
539542
self.usingdb = nil;
540543
self.bindingQueue = nil;

0 commit comments

Comments
 (0)