2011-06-13 19 views
9
साथ एक ही छवि

मुझे यह कह कर इस प्रस्तावना करने की अनुमति दें मेरा पहला ALAssetsLibrary का उपयोग कर रहा है। मुझे उपयोगकर्ता की सहेजी गई फोटो गैलरी में सबसे हाल की तस्वीर तक पहुंचने की ज़रूरत है। ऐसा लगता है ऐसा करने के लिए, मैं एक ALAssetsLibrary उदाहरण बना सकते हैं और पिछले छवि का चयन करने से पहले उपयोगकर्ता की गैलरी में हर आइटम से अधिक पुनरावृति करना है। यह हमेशा सबसे खराब स्थिति परिदृश्य है। क्या इस समस्या से निपटने के लिए एक तेज़/बेहतर तरीका है?पहुँच ALAssetsLibrary

उत्तर

15

आप उपयोगकर्ता की गैलरी में सभी तस्वीरें गणना करने की जरूरत नहीं है। ALAssetsGroup वर्ग एक विधि - (void)enumerateAssetsAtIndexes:(NSIndexSet *)indexSet options:(NSEnumerationOptions)options usingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock जो आप से संकेत मिलता है जो संपत्ति आप की गणना करना चाहते हैं का उपयोग कर सकते है।

आपके मामले में यह केवल अंतिम है इसलिए इंडेक्स सेट करें [NSIndexSet indexSetWithIndexesInRange:NSMakeRange([group numberOfAssets]-1, [group numberOfAssets]) जहां समूह आपका अलास्सेट समूह है।

@mithuntnt उल्लेख किया है, आप [[assetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop)

+0

धन्यवाद, आप रॉक! यही वही है जो मैं खोज रहा था। – Jacob

+1

उपरोक्त उत्तर में छोटी बग अगर आप इसका उपयोग कर रहे हैं। एनएसएमकेरेंज ([समूह संख्याऑफएसेट्स] -1, [समूह संख्याऑफएसेट्स]) एनएसएमकेरेंज ([समूह संख्याऑफएसेट्स] -1, 1) होना चाहिए (एनएसमेकरेंज का दूसरा पैरा गिनती है, अंत सूचकांक नहीं)। वैकल्पिक रूप से, [NSIndexSet अनुक्रमणिकासेट WithIndex: [समूह संख्याऑफएसेट्स] -1] थोड़ा अधिक कुशल है। –

0

http://developer.apple.com/library/ios/#documentation/AssetsLibrary/Reference/ALAssetsLibrary_Class/Reference/Reference.html

केवल एक गणन विधि नहीं है। तो यह एकमात्र तरीका है।

मैं पिछले आयात की गई फ़ोटो की जरूरत है। आप इस तरह के कुछ फिल्टर हो सकता है।

[[assetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 
    if(group) 
    { 
     NSString * groupName = [group valueForProperty:ALAssetsGroupPropertyName]; 

     if([@"Last Import" isEqualToString:groupName]) 
     { 
      *stop = true; 

...

1

इस बारे में क्या का उपयोग कर फोटो लाइब्रेरी के लिए ALAssetsGroup प्राप्त कर सकते हैं:

[group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { 
    if (result) { 
     *stop = YES; 
     //... 
    } 
}]; 
0

स्वीकार किए जाते हैं जवाब प्रकट नहीं होता है काम करने के लिए यदि आप एक गणना कर रहे हैं ALAssetGroup है कि आप पर एक फिल्टर निर्धारित किया है (क्योंकि [group numberOfAssets] रिटर्न कुल संपत्ति नहीं बल्कि तब कुल संपत्ति को छानने के बाद)। जांच करने के लिए है कि वापस आ ALAsset = शून्य

typedef void(^SMKMostRecentPhotoCompletionBlock)(ALAsset *asset); 

- (void)mostRecentPhotoWithCompletionBlock:(SMKMostRecentPhotoCompletionBlock)completionBlock 
{ 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    [library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 

    __block ALAsset *mostRecentPhoto = nil; 

    if (group) 
    { 
     [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 
     [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { 

      if (result != NULL) 
      { 
       mostRecentPhoto = result; 
       *stop = YES; 
      } 

     }]; 
    } 

    if (completionBlock) 
    { 
     completionBlock(mostRecentPhoto); 
    } 

} failureBlock:^(NSError *error) { 

    if (completionBlock) 
    { 
     completionBlock(nil); 
    } 

}]; 

}

अपने completionBlock में, यह सुनिश्चित कर लें:

मैं इस का इस्तेमाल किया।

संबंधित मुद्दे