我想用執行緒掃描照片庫,當我的應用邏輯確定后,我想把PHAsset添加到finalarray:
NSMutableArray <PHAsset *> *finalarray = [[NSMutableArray alloc] init]。
for (NSMutableArray *photoArray in arrayOfArrays) {
dispatch_group_enter(aGroup);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
for (PHAsset *asset in photoArray) {
[[PHImageManager defaultManager] requestImageDataForAsset:asset
選項:選項
resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSD Dictionary *info) {
//Make some logic NSDictionary *info.
if (logic) {
[finalarray addObject:asset];
}
}];
}
dispatch_group_leave(aGroup);
});
}
arrayOfArrays是PHAsset的陣列。
我的代碼作業正常,但有時我得到一個SIGABRT崩潰,我在代碼控制臺得到這個日志:
malloc: 不正確的校驗和 for freed object 0x1206d5968: probably modified after being freed.
損壞的值。0x100017580
malloc。*** 設定一個斷點 in malloc_error_break 來除錯
malloc。不正確的校驗和 for釋放的物件 0x1206d5968: 可能在被釋放后被修改。
損壞的值。0x100017580
uj5u.com熱心網友回復:
如果你有多個執行緒在更新一個屬性,你必須同步它們的訪問。你可以使用一個NSLock:
NSMutableArray <PHAsset *> *finalarray = [[NSMutableArray alloc] init]。
NSLock *lock = [[NSLock alloc] init]。
for (NSMutableArray *photoArray in arrayOfArrays) {
dispatch_group_enter(aGroup);
for (PHAsset *asset in photoArray) {
[[PHImageManager defaultManager] requestImageDataForAsset:asset
選項:選項
resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSD Dictionary *info) {
//Make some logic NSDictionary *info.
if (logic) {
[lock鎖]。
[finalarray addObject:asset];
[lock unlock];
dispatch_group_leave(aGroup);
}
}];
}
}
或者你可以使用GCD佇列:
NSMutableArray <PHAsset *> *finalarray = [[NSMutableArray alloc] init]。
dispatch_queue_t queue = dispatch_queue_create("...", NULL) 。
for (NSMutableArray *photoArray in arrayOfArrays) {
dispatch_group_enter(aGroup);
for (PHAsset *asset in photoArray) {
[[PHImageManager defaultManager] requestImageDataForAsset:asset
選項:選項
resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSD Dictionary *info) {
//Make some logic NSDictionary *info.
if (logic) {
dispatch_async(queue, ^{
[finalarray addObject:asset];
dispatch_group_leave(aGroup);
});
}
}];
}
}
注意,上面我假設你是以異步方式獲取圖片,在這種情況下,你對全域佇列的使用是不必要的,但你需要確保在requestImageDataForAsset中呼叫dispatch_group_leave in。
但是,無論如何,當你從多個執行緒訪問屬性時,請確保你的訪問是同步的(可以使用GCD佇列或一些鎖)。
uj5u.com熱心網友回復:
嘗試用一個突變器來同步你的代碼:
.
...
NSMutableArray <PHAsset *> *finalarray = [[NSMutableArray alloc] init]。
pthread_mutex_t mutex。
pthread_mutex_init(&mutex, NULL)。
for (NSMutableArray *photoArray in arrayOfArrays) {
dispatch_group_enter(aGroup);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
for (PHAsset *asset in photoArray) {
[[PHImageManager defaultManager] requestImageDataForAsset:asset
選項:選項
resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSD Dictionary *info) {
//Make some logic NSDictionary *info.
if (logic) {
pthread_mutex_lock(&mutex)。
[finalarray addObject:asset];
pthread_mutex_unlock(&mutex)。
}
}];
}
dispatch_group_leave(aGroup);
});
}
萬一這沒有幫助,你是否嘗試過在malloc_error_break中設定斷點以進行除錯,正如你的錯誤所提示的那樣?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/307582.html
標籤:
上一篇:C#Regexforcustomemailanddomain
下一篇:如何對照列舉值顯示下拉值?
