5

मैं आईओएस 6.x (6.0.1 विशेष रूप से इस समय) में एलासेट्स लाइब्रेरी चेंजडोटेशन के साथ काम कर रहा हूं, और मुझे परिणाम मिल रहा है जो मैं चाहता हूं प्रलेखन से जो कुछ मैं समझता हूं उसके आधार पर, मेरे userinfo में प्राप्त होने की उम्मीद है।आईओएस 6.0.1 एलासेट्स लाइब्रेरी चेंज नोटिफिकेशन, यह समझने की कोशिश कर रहा है कि

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(assetsLibraryDidChange:) name:ALAssetsLibraryChangedNotification object:_library]; 

परीक्षण करने के लिए, मैं अपने फोटो लाइब्रेरी में जाते हैं, और कुछ आइटम हटा, कुछ आइटम जोड़ने:

यहाँ घटना पंजीकरण के लिए मेरी कोड है।

यहां मेरा हैंडलर है।

- (void)assetsLibraryDidChange:(NSNotification *)note 
{ 
    NSDictionary* info = [note userInfo]; 
    NSLog(@"assetsLibraryDidChange calling syncPhotoInfoFromAssets, userInfo %@", info); 
    // If the user information dictionary is nil, reload all assets and asset groups. 
    if(note.userInfo==nil) { 
    [self syncPhotoInfoFromAssets]; 
    return; 
    } 

    // If the user information dictionary an empty dictionary, there is no need to reload assets and asset groups. 
    if(note.userInfo.count == 0) { 
    return; 
    } 

// If the user information dictionary is not empty, reload the effected assets and asset groups. For the keys used, see “Notification Keys.” 
    NSSet *updatedAssets = [info objectForKey:ALAssetLibraryUpdatedAssetsKey]; 
    NSSet *updatedAssetGroup = [info objectForKey:ALAssetLibraryUpdatedAssetGroupsKey]; 
    NSSet *deletedAssetGroup = [info objectForKey:ALAssetLibraryDeletedAssetGroupsKey]; 
    NSSet *insertedAssetGroup = [info objectForKey:ALAssetLibraryInsertedAssetGroupsKey]; 

    NSLog(@"updated assets:%@", updatedAssets); 
    NSLog(@"updated asset group:%@", updatedAssetGroup); 
    NSLog(@"deleted asset group:%@", deletedAssetGroup); 
    NSLog(@"inserted asset group:%@", insertedAssetGroup); 
    //further processing here 
} 

मेरी उत्पादन:

ALAssetLibraryUpdatedAssetGroupsKey = "{(\n assets-library://group/?id=736B6346-6DA2-4E43-8830-9C263B2D29ED\n)}"; 
    ALAssetLibraryUpdatedAssetsKey = "{(\n assets-library://asset/asset.JPG?id=A695208B-3546-4CCA-B539-B1D132A209B3&ext=JPG\n)}"; 
} 
2013-01-06 22:50:45.738 Olesi[25468:3613] updated assets:{(
    assets-library://asset/asset.JPG?id=A695208B-3546-4CCA-B539-B1D132A209B3&ext=JPG 
)} 
2013-01-06 22:50:45.738 Olesi[25468:3613] updated asset group:{(
    assets-library://group/?id=736B6346-6DA2-4E43-8830-9C263B2D29ED 
)} 
2013-01-06 22:50:45.739 Olesi[25468:3613] deleted asset group:(null) 
2013-01-06 22:51:06.658 Olesi[25468:3613] inserted asset group:(null) 

हटाने के बाद, और एक एल्बम डालने, मैं दोनों ALAssetLibraryDeletedAssetGroupsKey और ALAssetLibraryInsertedAssetGroupsKey, और ALAssetLibraryUpdatedAsset * कुंजी में से किसी में कुछ भी नहीं है में डेटा प्राप्त हुआ है की उम्मीद है। कोई विचार? मैंने देखा कि Apple's sample code जो इस अधिसूचना को सुनता है, भी चाबियों का उपयोग नहीं करता है, बल्कि विशिष्ट कुंजी के बावजूद सभी संपत्तियों को फिर से समझाता है (जो गंध करता है जैसे वे अधिसूचना जानकारी पर भरोसा नहीं करते हैं)

उत्तर

6

यदि आपके पास हटाए जा रहे समूह का संदर्भ नहीं है, ओएस आपको नहीं बताता है।

मैं निम्नलिखित कोड का उपयोग कर सही व्यवहार मिलता है:

#import "ROBKViewController.h" 
#import <AssetsLibrary/AssetsLibrary.h> 

@interface ROBKViewController() 

@property (nonatomic, strong) ALAssetsLibrary *assetsLibrary; 
@property (nonatomic, strong) ALAssetsGroup *currentAssetGroup; 

- (void) handleAssetChangedNotifiation:(NSNotification *)notification; 

@end 

@implementation ROBKViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 

    if (self) { 
     _assetsLibrary = [ALAssetsLibrary new]; 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAssetChangedNotifiation:) name:ALAssetsLibraryChangedNotification object:_assetsLibrary]; 
    } 

    return self; 
} 

- (void) dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:ALAssetsLibraryChangedNotification object:nil]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    [self.assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 
    } failureBlock:^(NSError *error) { 
    }]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - Notification handlers 

- (void) handleAssetChangedNotifiation:(NSNotification *)notification 
{ 
    NSLog(@"notification: %@", notification); 

    if ([notification userInfo]) { 
     NSSet *insertedGroupURLs = [[notification userInfo] objectForKey:ALAssetLibraryInsertedAssetGroupsKey]; 
     NSURL *assetURL = [insertedGroupURLs anyObject]; 
     if (assetURL) { 
      [self.assetsLibrary groupForURL:assetURL resultBlock:^(ALAssetsGroup *group) { 
       self.currentAssetGroup = group; 
      } failureBlock:^(NSError *error) { 

      }]; 
     } 
    } 

} 

@end 

ध्यान दें कि मैं केवल समूह है कि self.currentAssetGroup करने के लिए आवंटित के लिए सूचना मिलती है।

+2

धन्यवाद। Http://developer.apple.com/library/ios/#documentation/AssetsLibrary/Reference/ALAssetsLibrary_Class/Reference/Reference.html#//apple_ref/doc/constant_group/Notification_Keys पढ़ने में मैंने गलत पढ़ा है कि मैं एक प्राप्त करने में सक्षम होगा किसी भी प्रभावित संपत्ति के लिए यूआरएल की सूची। ऐसा लगता है कि हमें केवल संपत्तियों की एक सूची मिलती है जब वे * संशोधित * होते हैं, और सम्मिलन या हटाने के लिए, केवल उनकी संबंधित संपत्ति * समूहों * के लिए एक अधिसूचना, इस अधिसूचना को मूल रूप से उम्मीद से कम उपयोगी प्रदान करते हैं, खासकर इस समय से मैं केवल एक समूह से निपट रहा हूँ। –

+1

हाँ, दस्तावेज़ों के मुताबिक: "एलासेट समूह को अमान्य करके हटाए गए या हटाए गए अलास्सेट की पहचान की जाती है।" यह बहुत दुर्भाग्यपूर्ण है, और ऐसा लगता है कि यदि कोई संपत्ति जोड़ा या निकाला गया तो आपको पूरे समूह को पुनः लोड करना होगा (जैसे कैमरा रोल)। – akaru

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