In the WouldYaViewController.m implementation file, we need to do the following:
Synthesize the additional properties we have added:
@synthesize rightCelebrity, rightCelebrityLabel, rightCelebrityButton, currentGender, genderButton, playAgainButton, rightResponseLabel, leftResponseLabel, wouldYa;
The most important thing is to change the loadCelebrities method to use queries instead of filtering in the client. We are also adding rightCelebrity as well. You will see that leftCelebrity is retrieved with the following query:
(gender eq '%@' and guid eq random(guid))
For rightCelebrity, we need to also ensure that we do not retrieve the same celebrity as leftCelebrity, and so we have to get the guid for leftCelebrity, create a query that will make sure that rightCelebrity is different. To do this, we create the query string with NSString stringWithFormat: and getting the guid for leftCelebrity using the FatFractal metaDataForObj: method.
[NSString stringWithFormat:
@"/ff/resources/Celebrity/(gender eq '%@' and guid ne '%@' and guid eq random(guid))",
currentGender,
[[[FatFractal main] metaDataForObj:leftCelebrity] guid]]
Here is the modified loadCelebrities method:
- (void) loadCelebrities {
playAgainButton.hidden = YES;
playAgainButton.enabled = NO;
[leftCelebrityButton setImage:nil forState:UIControlStateNormal];
[rightCelebrityButton setImage:nil forState:UIControlStateNormal];
[[leftCelebrityButton layer] setBorderColor:[UIColor grayColor].CGColor];
[[rightCelebrityButton layer] setBorderColor:[UIColor grayColor].CGColor];
[[FatFractal main] getObjFromUrl:[NSString stringWithFormat:
@"/ff/resources/Celebrity/(gender eq '%@' and guid eq random(guid))",
currentGender]
onComplete:^(NSError *err, id celeb, NSHTTPURLResponse *httpResponse)
{
if (err) {
NSLog(@"WouldYaViewController loadCelebrities leftCelebrity failed: %@", [err localizedDescription]);
[leftCelebrityButton setBackgroundImage:[UIImage imageNamed:@"mystery2.png"] forState:UIControlStateNormal];
leftCelebrityLabel.text = @"No celebrities found";
[rightCelebrityButton setBackgroundImage:[UIImage imageNamed:@"mystery3.png"] forState:UIControlStateNormal];
rightCelebrityLabel.text = @"No celebrities found";
return;
}
if(celeb) {
leftCelebrity = celeb;
FFMetaData *meta = [[FatFractal main] metaDataForObj:celeb];
leftCelebrityLabel.text = [NSString stringWithFormat:@"%@ %@", leftCelebrity.firstName, leftCelebrity.lastName];
[leftCelebrityButton setBackgroundImage:[[UIImage alloc] initWithData:leftCelebrity.imageData] forState:UIControlStateNormal];
NSError * error;
rightCelebrity = [[FatFractal main]
getObjFromUrl:[NSString stringWithFormat:
@"/ff/resources/Celebrity/(gender eq '%@' and guid ne '%@' and guid eq random(guid))",
currentGender,
[[[FatFractal main] metaDataForObj:leftCelebrity] guid]]
error:&error];
if (error) {
NSLog(@"WouldYaViewController loadCelebrities rightCelebrity failed: %@", [error localizedDescription]);
[rightCelebrityButton setBackgroundImage:[UIImage imageNamed:@"genericfriendicon.png"] forState:UIControlStateNormal];
rightCelebrityLabel.text = @"No celebrities found";
return;
}
if(rightCelebrity) {
FFMetaData *meta = [[FatFractal main] metaDataForObj:rightCelebrity];
rightCelebrityLabel.text = [NSString stringWithFormat:@"%@ %@", rightCelebrity.firstName, rightCelebrity.lastName];
[rightCelebrityButton setBackgroundImage:[[UIImage alloc] initWithData:rightCelebrity.imageData] forState:UIControlStateNormal];
} else {
NSLog(@"WouldYaViewController loadCelebrities rightCelebrity not found.");
[rightCelebrityButton setBackgroundImage:[UIImage imageNamed:@"genericfriendicon.png"] forState:UIControlStateNormal];
rightCelebrityLabel.text = @"No celebrities found";
}
} else {
NSLog(@"WouldYaViewController loadCelebrities leftCelebrity not found.");
[leftCelebrityButton setBackgroundImage:[UIImage imageNamed:@"genericfriendicon.png"] forState:UIControlStateNormal];
leftCelebrityLabel.text = @"No celebrities found";
}
}];
}
Next, we add the toggleGender method implementation to handle the genderButton click:
- (IBAction)toggleGender:(id)sender {
if([genderButton.currentTitle isEqualToString:@"Male"]) {
[genderButton setTitle:@"Female" forState:UIControlStateNormal];
currentGender = @"female";
} else {
[genderButton setTitle:@"Male" forState:UIControlStateNormal];
currentGender = @"male";
}
[self loadCelebrities];
}
Add the celebrityWasPicked method implementation to handle leftCelebrityButton or rightCelebrityButton clicks:
- (IBAction)celebrityWasPicked:(id)sender {
if(sender == leftCelebrityButton) {
wouldYa.selectedGuid = [[[FatFractal main] metaDataForObj:leftCelebrity] guid];
wouldYa.rejectedGuid = [[[FatFractal main] metaDataForObj:rightCelebrity] guid];
} else if(sender == rightCelebrityButton) {
wouldYa.selectedGuid = [[[FatFractal main] metaDataForObj:rightCelebrity] guid];
wouldYa.rejectedGuid = [[[FatFractal main] metaDataForObj:leftCelebrity] guid];
}
if(wouldYa) [self persistWouldYa];
else NSLog(@"WouldYaViewController celebrityWasPicked failed: wouldYa is nil");
}
Add the persistWouldYa method implementation that will persist your wouldYa instance to the API after ensuring that the user is logged in. This is implemented as a separate method to make it easier to use a callback from the showLoginWithDelegate: action: message: method in AppDelegate.
- (void)persistWouldYa {
if(![[FatFractal main] loggedIn]) {
[(AppDelegate *)[[UIApplication sharedApplication] delegate]
showLoginWithDelegate:self action:@selector(persistWouldYa)
message:@"Please Login"];
} else {
playAgainButton.enabled = YES;
playAgainButton.hidden = NO;
NSError *error;
if(wouldYa) { [[FatFractal main] createObj:wouldYa atUrl:@"/WouldYa" error:&error];
if(error) NSLog(@"WouldYaViewController persistWouldYa failed: %@", [error localizedDescription]);
else {
wouldYa = nil;
wouldYa = [[WouldYa alloc]init];
}
} else NSLog(@"WouldYaViewController persistWouldYa failed: wouldYa is nil");
}
}
NEXT: Adding the UI