Created
April 12, 2012 15:17
-
-
Save iKenndac/2368081 to your computer and use it in GitHub Desktop.
Waiting for multiple tiers to load in an object graph
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
This method uses a blocks-based callback mechanism to handle the async process in which | |
most objects in the CocoaLibSpotify pbject graph use. | |
This is an example of how to improve the method -waitAndFillTrackPool in the CocoaLibSpotify | |
"Guess The Intro" sample, which calls the same method repeatedly until enough loaded tracks | |
are found. | |
The code below waits until the session is loaded, then the userPlaylists list, then the | |
playlists themselves, then all of the tracks within those playlists. Once the tracks have | |
loaded their metadata, the game is started. | |
*/ | |
-(void)fillTrackPool { | |
[SPAsyncLoadingObserver waitUntilLoaded:[NSArray arrayWithObject:[SPSession sharedSession]] then:^(NSArray *loadedession) { | |
// The session is logged in and loaded — now wait for the userPlaylists to load. | |
NSLog(@"Session loaded."); | |
[SPAsyncLoadingObserver waitUntilLoaded:[NSArray arrayWithObject:[SPSession sharedSession].userPlaylists] then:^(NSArray *loadedContainers) { | |
// User playlists are loaded — wait for playlists to load their metadata. | |
NSLog(@"Container loaded."); | |
NSMutableArray *playlists = [NSMutableArray array]; | |
[playlists addObject:[SPSession sharedSession].starredPlaylist]; | |
[playlists addObject:[SPSession sharedSession].inboxPlaylist]; | |
[playlists addObjectsFromArray:[SPSession sharedSession].userPlaylists.flattenedPlaylists]; | |
[SPAsyncLoadingObserver waitUntilLoaded:playlists then:^(NSArray *loadedPlaylists) { | |
// All of our playlists have loaded their metadata — wait for all tracks to load their metadata. | |
NSLog(@"All playlists loaded."); | |
NSArray *playlistItems = [loadedPlaylists valueForKeyPath:@"@unionOfArrays.items"]; | |
NSArray *tracks = [self tracksFromPlaylistItems:playlistItems]; | |
[SPAsyncLoadingObserver waitUntilLoaded:tracks then:^(NSArray *loadedTracks) { | |
// All of our tracks have loaded their metadata. Hooray! | |
NSLog(@"All tracks loaded."); | |
NSMutableArray *theTrackPool = [NSMutableArray arrayWithCapacity:loadedTracks.count]; | |
for (SPTrack *aTrack in loadedTracks) { | |
if (aTrack.availability == SP_TRACK_AVAILABILITY_AVAILABLE && [aTrack.name length] > 0) | |
[theTrackPool addObject:aTrack]; | |
} | |
self.trackPool = [NSMutableArray arrayWithArray:[[NSSet setWithArray:theTrackPool] allObjects]]; | |
// ^ Thin out duplicates. | |
[self startNewRound]; | |
}]; | |
}]; | |
}]; | |
}]; | |
} |
This is, at the moment, a proposed API. You can find an example implementation in the experimental/ARC-threaded branch of CocoaLibSpotify, however, that branch is NOT suitable for use in production code.
great thank you!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This looks great! however, where is the implementation of SPAsyncLoadingObserver?