cs193p – Assignment #5 Task #6

Please note, this blog entry is from a previous course. You might want to check out the current one.

Sort all tables alphabetically (and case insensitively) except the Recents table (which should still be sorted with the most recently viewed first). A good solution to this might involve some of the array sorting methods that use blocks.

… actually the code up to this task already does sorting, but now it will be implemented using blocks.

For the tags create a new property – to do not have to resort everything every time the table needs to display a row:

@property (nonatomic, strong) NSArray *tags;
...
- (void)updatePhotosByTag
{
    ...
    self.tags = [[photosByTag allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        return [obj1 compare:obj2 options:NSCaseInsensitiveSearch];
    }];
}

Continue reading “cs193p – Assignment #5 Task #6”

Facebooktwittergoogle_plusredditpinterestlinkedintumblrmailFacebooktwittergoogle_plusredditpinterestlinkedintumblrmail

cs193p – Assignment #5 Task #5

Please note, this blog entry is from a previous course. You might want to check out the current one.

Keep as little of the photos’ image data in the heap as you can (i.e. don’t keep strong pointers to any NSData and/or UIImage objects that you are not currently displaying). You should have at most 2 photos’ image data in memory at a given time, preferably only 1 (or 0 if none are in the process of being viewed or fetched).

The current code up to this task does not keep any strong pointers to NSData or NSImage objects as the image is only stored in the image view. Because the iPad uses a single image view there is at most only one image in memory. The iPhone has two image views thus there could be two images in memory. (Using the profiler proves that behavior)
Continue reading “cs193p – Assignment #5 Task #5”

Facebooktwittergoogle_plusredditpinterestlinkedintumblrmailFacebooktwittergoogle_plusredditpinterestlinkedintumblrmail

cs193p – Assignment #5 Task #4

Please note, this blog entry is from a previous course. You might want to check out the current one.

Cache photo image data viewed by the user into files in your application’s sandbox. Each photo’s image should be a separate file in the sandbox. Limit the cache’s size to something testable. When this limit is reached, the least recently viewed photos in the cache should be evicted (deleted) to make room for new photos coming in (remember that you can look at a file URL’s resource values to find out when it was last accessed). Your application should never query Flickr for the image data for a photo that it has in its cache (obviously). This cache should persist between application launches.

Before loading an image, check if it is already in the file cache, and load it from there if possible. After the image has been loaded save it to the cache:
Continue reading “cs193p – Assignment #5 Task #4”

Facebooktwittergoogle_plusredditpinterestlinkedintumblrmailFacebooktwittergoogle_plusredditpinterestlinkedintumblrmail

cs193p – Assignment #5 Task #3

Please note, this blog entry is from a previous course. You might want to check out the current one.

Your primary table view must now have Refreshing enabled (i.e. you can pull down on it to activate the UIRefreshControl). Doing so should refetch the Stanford photo information from Flickr (of course, it’s unlikely to have changed, but refetch anyway).

You could drag out the refresh-control gestures in storyboard (you would have to do it twice) – or create it in code:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.refreshControl = [[UIRefreshControl alloc] init];
    [self.refreshControl addTarget:self
                            action:@selector(loadPhtosFromFlickr)
                  forControlEvents:UIControlEventValueChanged];
    [self loadPhtosFromFlickr];
}

… and move the download code to a new method:

- (void)loadPhtosFromFlickr
{
    [self.refreshControl beginRefreshing];
    ...
    dispatch_async(queue, ^{
        ...
        dispatch_async(dispatch_get_main_queue(), ^{
            ...
            [self.refreshControl endRefreshing];
        });
    }); 
}

The complete code is available on github.

Facebooktwittergoogle_plusredditpinterestlinkedintumblrmailFacebooktwittergoogle_plusredditpinterestlinkedintumblrmail

cs193p – Assignment #5 Task #2

Please note, this blog entry is from a previous course. You might want to check out the current one.

The user-interface should always be giving some indication (e.g. a UIActivityIndicatorView) to the user when the currently displaying user-interface is going to show something when some active thread finishes. The network activity indicator in the status bar is not sufficient for this, but your application should also turn on the networkActivityIndicator whenever it is accessing the network (and only then).

The table view will use the refresh-control feature in the following thus – there is no need to put an extra activity indicator there for now.

Change in both storyboards the background of the scroll views to black (which is a cosmetic change only) … the rest will be done in code to avoid having to duplicate everything for both storyboards.
Continue reading “cs193p – Assignment #5 Task #2”

Facebooktwittergoogle_plusredditpinterestlinkedintumblrmailFacebooktwittergoogle_plusredditpinterestlinkedintumblrmail

cs193p – Assignment #5 Task #1

Please note, this blog entry is from a previous course. You might want to check out the current one.

Your application must implement all the required tasks from the last assignment (and all the required tasks in this assignment) without doing any Flickr fetching or file system interactions in the main thread. Your user-interface should be responsive to the user at all times (i.e. the main thread should never be blocked).

Flickr is accessed twice. First when the data is loaded to populate the first table. Create a new dispatch queue and load the photos there. As soon is this is done return to the main queue and set the photos property:

- (void)viewDidLoad
{
    [super viewDidLoad];    
    dispatch_queue_t queue = dispatch_queue_create("Flickr Downloader", NULL);
    dispatch_async(queue, ^{
        NSArray *photos = [FlickrFetcher stanfordPhotos];
        dispatch_async(dispatch_get_main_queue(), ^{
            self.photos = photos;
        });
    });
}

Continue reading “cs193p – Assignment #5 Task #1”

Facebooktwittergoogle_plusredditpinterestlinkedintumblrmailFacebooktwittergoogle_plusredditpinterestlinkedintumblrmail