2011-08-26 35 views
1

我在應用程序上使用資產庫來枚舉設備的照片事件。iPhone和iPad與資產庫之間的不同行爲

當我在iPad上測試時,我的代碼正常工作。照片事件被枚舉,我可以完美地處理它們。當我嘗試使用我的iPhone上的相同代碼時,沒有任何反應(並且我也在此設備上安裝了照片事件)。它看起來好像枚舉代碼甚至沒有被調用(即沒有日誌出現在控制檯中,參見代碼)。

下面是代碼:

- (void)loadEvents { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    [library enumerateGroupsWithTypes:ALAssetsGroupEvent 
          usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 
           if (group) { 
            [photosEventsArray addObject:group]; 
            NSLog(@"Adding group"); 
           } else { 
            NSLog(@"End of the enumeration"); 
           } 
          } 
         failureBlock: ^(NSError *error) { 
        NSLog(@"Failure while enumerating assets: %@", error); 
         }]; 
    [library release]; 

    NSLog(@"Found %d events", photosEventsFound); 

    [self performSelectorOnMainThread:@selector(stopSpinner) withObject:nil waitUntilDone:YES]; 
    [pool drain]; 
} 

我的部署目標是iOS 4.1的。

有什麼想法在這裏出了什麼問題?

回答

1

經過更多的調查,似乎在iOS 4.3.5上,enumerateGroupsWithTypes方法必須從主線程調用。

我修補我的代碼,這樣(從iPhone和iPod Touch,設置NO和YES從iPad的):

if (scanAssetsInBackground) { 
    [self performSelectorInBackground:@selector(loadEvents) withObject:nil]; 
} else { 
    [self performSelectorOnMainThread:@selector(loadEvents) withObject:nil waitUntilDone:YES]; 
} 

正常工作與該修補程序。

在Apple文檔中沒有太多有關此信息,也無法知道哪種方式(背景或主線程)是掃描資產庫的正確方法。

相關問題