मैं एलेसेट्स को एरे में स्टोर करने के लिए [एलासेट्स लाइब्रेरी एन्युमेरेट ग्रुप विथ टाइप्स:] का उपयोग कर रहा हूं। चूंकि यह एक असीमित ऑपरेशन है, इसलिए मुझे अपने काम को जारी रखने से पहले इसे खत्म करने की प्रतीक्षा करनी है।अलास्सेट्स लाइब्रेरी एन्युमरेट ग्रुप्सथथ टाइप्स: - थ्रेड सिंक्रनाइज़ेशन
मैंने Cocoa thread synchronisation when using [ALAssetsLibrary enumerateGroupsWithTypes:] पढ़ा और अनुशंसित NSConditionLock को आजमाया। हालांकि, ब्लॉक हमेशा मुख्य धागे में किए जाते हैं, इस प्रकार यदि मैं कंडीशनॉक का उपयोग करने का इंतजार करता हूं, तो मुख्य धागा अवरुद्ध हो जाता है और ब्लॉक निष्पादित नहीं होंगे -> मैं फंस गया हूं। मैंने एक नए धागे पर विधि loadAssets को चलाने का भी प्रयास किया, लेकिन फिर भी ब्लॉक मुख्य थ्रेड पर निष्पादित हो जाते हैं।
मुझे गणित खत्म होने के लिए वास्तव में प्रतीक्षा करने का कोई तरीका नहीं मिल रहा है। क्या मुख्य धागे की तुलना में ब्लॉक को किसी अन्य थ्रेड पर मजबूर करने का कोई तरीका है या मैं और कुछ भी कर सकता हूं?
- (void)loadAssets
{
assets = [NSMutableArray array];
NSConditionLock *threadLock = [[NSConditionLock alloc] initWithCondition:THREADRUNNING];
void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop)
{
if(result != nil)
{
[assets addObject:result];
}
};
void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop)
{
if(group != nil)
{
[group enumerateAssetsUsingBlock:assetEnumerator];
}
[threadLock lock];
[threadLock unlockWithCondition:THREADFINISHED];
};
void (^assetFailureBlock)(NSError *) = ^(NSError *error)
{
[threadLock lock];
[threadLock unlockWithCondition:THREADFINISHED];
};
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:assetGroupEnumerator failureBlock:assetFailureBlock];
[threadLock lockWhenCondition:THREADFINISHED];
[threadLock unlock];
[assetsLibrary release];
[threadLock release];
}
मुझे नहीं लगता कि यह सही है। enumerateGroupsWithTypes लगभग निश्चित रूप से ऑब्जेक्ट को तब तक बनाए रखता है जब तक यह पूरा नहीं हो जाता है। यदि आप एनएसएलओजी का उपयोग करते हैं तो संपत्तियों को बनाए रखने के लिए पुस्तकालय, आप देखेंगे कि यह रिलीज के बाद भी 1 है। –