Skip to content

Instantly share code, notes, and snippets.

@Jxrgxn
Created April 30, 2015 19:27
Show Gist options
  • Save Jxrgxn/b80a2aa88fb4d1a90b76 to your computer and use it in GitHub Desktop.
Save Jxrgxn/b80a2aa88fb4d1a90b76 to your computer and use it in GitHub Desktop.
//Begin .h file
//
// TKCache.h
// TokenApp
//
// Created by BASEL FARAG on 12/18/14.
// Copyright (c) 2014 ABaselNotBasilProduction. All rights reserved.
//
//The purpose of this Support file is to provide custom caching behavior that can be used to quickly display up to date information about media. When the current user likes or comment on a given media we manually update the local cache as soon as the request is sent. This allows us to propogate the model change throughout the app without need to wait for the initial save request to finish and then refreshing the content.
//So for example we can manually manage the like and comment information of images so that the UI stays responsive and accurate when the user likes and comments on photos.
#import <Foundation/Foundation.h>
#import "Macros.h"
@interface TKCache : NSObject
+ (id)sharedCache;
- (void)clear;
- (void)setAttributesForPhoto:(PFObject *)photo likers:(NSArray *)likers commenters:(NSArray *)commenters likedByCurrentUser:(BOOL)likedByCurrentUser;
- (NSDictionary *)attributesForPhoto:(PFObject *)photo;
- (NSNumber *)likeCountForPhoto:(PFObject *)photo;
- (NSNumber *)commentCountForPhoto:(PFObject *)photo;
- (NSArray *)likersForPhoto:(PFObject *)photo;
- (NSArray *)commentersForPhoto:(PFObject *)photo;
- (void)setPhotoIsLikedByCurrentUser:(PFObject *)photo liked:(BOOL)liked;
- (BOOL)isPhotoLikedByCurrentUser:(PFObject *)photo;
- (void)incrementLikerCountForPhoto:(PFObject *)photo;
- (void)decrementLikerCountForPhoto:(PFObject *)photo;
- (void)incrementCommentCountForPhoto:(PFObject *)photo;
- (void)decrementCommentCountForPhoto:(PFObject *)photo;
//-(void)setAttributesForVideo:(PFObject *)video;
- (NSDictionary *)attributesForUser:(PFUser *)user;
- (NSNumber *)photoCountForUser:(PFUser *)user;
- (BOOL)followStatusForUser:(PFUser *)user;
- (void)setPhotoCount:(NSNumber *)count user:(PFUser *)user;
- (void)setFollowStatus:(BOOL)following user:(PFUser *)user;
- (void)setFacebookFriends:(NSArray *)friends;
- (NSArray *)facebookFriends;
@end
//Begin .m file
//
// TKCache.m
// TokenApp
//
// Created by BASEL FARAG on 12/18/14.
// Copyright (c) 2014 ABaselNotBasilProduction. All rights reserved.
//
#import "TKCache.h"
#import "Macros.h"
#import "Constants.h"
@interface TKCache()
@property (nonatomic, strong) NSCache *cache;
- (void)setAttributes:(NSDictionary *)attributes forPhoto:(PFObject *)photo;
@end
@implementation TKCache
@synthesize cache;
#pragma mark - Initialization
+ (id)sharedCache {
static dispatch_once_t pred = 0;
__strong static id _sharedObject = nil;
dispatch_once(&pred, ^{
_sharedObject = [[self alloc] init];
});
return _sharedObject;
}
- (id)init {
self = [super init];
if (self) {
self.cache = [[NSCache alloc] init];
}
return self;
}
#pragma mark - PTKCache
- (void)clear {
[self.cache removeAllObjects];
}
- (void)setAttributesForPhoto:(PFObject *)photo likers:(NSArray *)likers commenters:(NSArray *)commenters likedByCurrentUser:(BOOL)likedByCurrentUser {
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:likedByCurrentUser],kPTKPhotoAttributesIsLikedByCurrentUserKey,
@([likers count]),kPTKPhotoAttributesLikeCountKey,
likers,kPTKPhotoAttributesLikeCountKey,
@([commenters count]),kPTKPhotoAttributesLikeCountKey,
commenters,kPTKPhotoAttributesCommentersKey,
nil];
[self setAttributes:attributes forPhoto:photo];
}
- (NSDictionary *)attributesForPhoto:(PFObject *)photo {
NSString *key = [self keyForPhoto:photo];
return [self.cache objectForKey:key];
}
- (NSNumber *)likeCountForPhoto:(PFObject *)photo {
NSDictionary *attributes = [self attributesForPhoto:photo];
if (attributes) {
return [attributes objectForKey:kPTKPhotoAttributesLikeCountKey];
}
return [NSNumber numberWithInt:0];
}
- (NSNumber *)commentCountForPhoto:(PFObject *)photo {
NSDictionary *attributes = [self attributesForPhoto:photo];
if (attributes) {
return [attributes objectForKey:kPTKPhotoAttributesLikeCountKey];
}
return [NSNumber numberWithInt:0];
}
- (NSArray *)likersForPhoto:(PFObject *)photo {
NSDictionary *attributes = [self attributesForPhoto:photo];
if (attributes) {
return [attributes objectForKey:kPTKPhotoAttributesLikeCountKey];
}
return [NSArray array];
}
- (NSArray *)commentersForPhoto:(PFObject *)photo {
NSDictionary *attributes = [self attributesForPhoto:photo];
if (attributes) {
return [attributes objectForKey:kPTKPhotoAttributesCommentersKey];
}
return [NSArray array];
}
- (void)setPhotoIsLikedByCurrentUser:(PFObject *)photo liked:(BOOL)liked {
NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithDictionary:[self attributesForPhoto:photo]];
[attributes setObject:[NSNumber numberWithBool:liked] forKey:kPTKPhotoAttributesIsLikedByCurrentUserKey];
[self setAttributes:attributes forPhoto:photo];
}
- (BOOL)isPhotoLikedByCurrentUser:(PFObject *)photo {
NSDictionary *attributes = [self attributesForPhoto:photo];
if (attributes) {
return [[attributes objectForKey:kPTKPhotoAttributesIsLikedByCurrentUserKey] boolValue];
}
return NO;
}
- (void)incrementLikerCountForPhoto:(PFObject *)photo {
NSNumber *likerCount = [NSNumber numberWithInt:[[self likeCountForPhoto:photo] intValue] + 1];
NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithDictionary:[self attributesForPhoto:photo]];
[attributes setObject:likerCount forKey:kPTKPhotoAttributesLikeCountKey];
[self setAttributes:attributes forPhoto:photo];
}
- (void)decrementLikerCountForPhoto:(PFObject *)photo {
NSNumber *likerCount = [NSNumber numberWithInt:[[self likeCountForPhoto:photo] intValue] - 1];
if ([likerCount intValue] < 0) {
return;
}
NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithDictionary:[self attributesForPhoto:photo]];
[attributes setObject:likerCount forKey:kPTKPhotoAttributesLikeCountKey];
[self setAttributes:attributes forPhoto:photo];
}
- (void)incrementCommentCountForPhoto:(PFObject *)photo {
NSNumber *commentCount = [NSNumber numberWithInt:[[self commentCountForPhoto:photo] intValue] + 1];
NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithDictionary:[self attributesForPhoto:photo]];
[attributes setObject:commentCount forKey:kPTKPhotoAttributesLikeCountKey];
[self setAttributes:attributes forPhoto:photo];
}
- (void)decrementCommentCountForPhoto:(PFObject *)photo {
NSNumber *commentCount = [NSNumber numberWithInt:[[self commentCountForPhoto:photo] intValue] - 1];
if ([commentCount intValue] < 0) {
return;
}
NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithDictionary:[self attributesForPhoto:photo]];
[attributes setObject:commentCount forKey:kPTKPhotoAttributesLikeCountKey];
[self setAttributes:attributes forPhoto:photo];
}
- (void)setAttributesForUser:(PFUser *)user photoCount:(NSNumber *)count followedByCurrentUser:(BOOL)following {
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
count,kPTKUserAttributesPhotoCountKey,
[NSNumber numberWithBool:following],kPTKPhotoAttributesIsLikedByCurrentUserKey,
nil];
[self setAttributes:attributes forUser:user];
}
- (NSDictionary *)attributesForUser:(PFUser *)user {
NSString *key = [self keyForUser:user];
return [self.cache objectForKey:key];
}
- (NSNumber *)photoCountForUser:(PFUser *)user {
NSDictionary *attributes = [self attributesForUser:user];
if (attributes) {
NSNumber *photoCount = [attributes objectForKey:kPTKUserAttributesPhotoCountKey];
if (photoCount) {
return photoCount;
}
}
return [NSNumber numberWithInt:0];
}
- (BOOL)followStatusForUser:(PFUser *)user {
NSDictionary *attributes = [self attributesForUser:user];
if (attributes) {
NSNumber *followStatus = [attributes objectForKey:kPTKPhotoAttributesIsLikedByCurrentUserKey];
if (followStatus) {
return [followStatus boolValue];
}
}
return NO;
}
- (void)setPhotoCount:(NSNumber *)count user:(PFUser *)user {
NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithDictionary:[self attributesForUser:user]];
[attributes setObject:count forKey:kPTKUserAttributesPhotoCountKey];
[self setAttributes:attributes forUser:user];
}
- (void)setFollowStatus:(BOOL)following user:(PFUser *)user {
NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithDictionary:[self attributesForUser:user]];
[attributes setObject:[NSNumber numberWithBool:following] forKey:kPTKPhotoAttributesIsLikedByCurrentUserKey];
[self setAttributes:attributes forUser:user];
}
- (void)setFacebookFriends:(NSArray *)friends {
NSString *key = kPTKUserFacebookFriendsKey;
[self.cache setObject:friends forKey:key];
[[NSUserDefaults standardUserDefaults] setObject:friends forKey:key];
[[NSUserDefaults standardUserDefaults] synchronize];
}
- (NSArray *)facebookFriends {
NSString *key = kPTKUserFacebookFriendsKey;
if ([self.cache objectForKey:key]) {
return [self.cache objectForKey:key];
}
NSArray *friends = [[NSUserDefaults standardUserDefaults] objectForKey:key];
if (friends) {
[self.cache setObject:friends forKey:key];
}
return friends;
}
#pragma mark - ()
- (void)setAttributes:(NSDictionary *)attributes forPhoto:(PFObject *)photo {
NSString *key = [self keyForPhoto:photo];
[self.cache setObject:attributes forKey:key];
}
- (void)setAttributes:(NSDictionary *)attributes forUser:(PFUser *)user {
NSString *key = [self keyForUser:user];
[self.cache setObject:attributes forKey:key];
}
- (NSString *)keyForPhoto:(PFObject *)photo {
return [NSString stringWithFormat:@"photo_%@", [photo objectId]];
}
- (NSString *)keyForUser:(PFUser *)user {
return [NSString stringWithFormat:@"user_%@", [user objectId]];
}
@end
//Begin .h for TKutility
//Utility file designed to implement likes, comments, follows, and posts for a social media application
//
// TKUtility.h
// TokenApp
//
// Created by BASEL FARAG on 12/19/14.
// Copyright (c) 2014 ABaselNotBasilProduction. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Macros.h"
@interface TKUtility : NSObject
+ (void)likePhotoInBackground:(id)photo block:(void (^)(BOOL succeeded, NSError *error))completionBlock;
+ (void)unlikePhotoInBackground:(id)photo block:(void (^)(BOOL succeeded, NSError *error))completionBlock;
+ (void)processFacebookProfilePictureData:(NSData *)data;
+ (BOOL)userHasValidFacebookData:(PFUser *)user;
+ (BOOL)userHasProfilePictures:(PFUser *)user;
+ (UIImage *)defaultProfilePicture;
+ (NSString *)firstNameForDisplayName:(NSString *)displayName;
+ (void)followUserInBackground:(PFUser *)user block:(void (^)(BOOL succeeded, NSError *error))completionBlock;
+ (void)followUserEventually:(PFUser *)user block:(void (^)(BOOL succeeded, NSError *error))completionBlock;
+ (void)followUsersEventually:(NSArray *)users block:(void (^)(BOOL succeeded, NSError *error))completionBlock;
+ (void)unfollowUserEventually:(PFUser *)user;
+ (void)unfollowUsersEventually:(NSArray *)users;
+ (void)drawSideDropShadowForRect:(CGRect)rect inContext:(CGContextRef)context;
+ (void)drawSideAndBottomDropShadowForRect:(CGRect)rect inContext:(CGContextRef)context;
+ (void)drawSideAndTopDropShadowForRect:(CGRect)rect inContext:(CGContextRef)context;
+ (PFQuery *)queryForActivitiesOnPhoto:(PFObject *)photo cachePolicy:(PFCachePolicy)cachePolicy;
@end
//Begin .m file
//
// TKUtility.m
// TokenApp
//
// Created by BASEL FARAG on 12/19/14.
// Copyright (c) 2014 ABaselNotBasilProduction. All rights reserved.
//
#import "TKUtility.h"
#import "Macros.h"
#import "TKCache.h"
#import "Constants.h"
#import <PFFacebookUtils.h>
#import "UIImage+ResizeAdditions.h"
@implementation TKUtility
#pragma mark Like Photos
+ (void)likePhotoInBackground:(id)photo block:(void (^)(BOOL succeeded, NSError *error))completionBlock {
PFQuery *queryExistingLikes = [PFQuery queryWithClassName:kPTKActivityClassKey];
[queryExistingLikes whereKey:kPTKActivityPhotoKey equalTo:photo];
[queryExistingLikes whereKey:kPTKActivityTypeKey equalTo:kPTKActivityTypeKey];
[queryExistingLikes whereKey:kPTKActivityFromUserKey equalTo:[PFUser currentUser]];
[queryExistingLikes setCachePolicy:kPFCachePolicyNetworkOnly];
[queryExistingLikes findObjectsInBackgroundWithBlock:^(NSArray *activities, NSError *error) {
if (!error) {
for (PFObject *activity in activities) {
[activity delete];
}
}
// proceed to creating new like
PFObject *likeActivity = [PFObject objectWithClassName:kPTKActivityClassKey];
[likeActivity setObject:kPTKActivityTypeKey forKey:kPTKActivityTypeKey];
[likeActivity setObject:[PFUser currentUser] forKey:kPTKActivityFromUserKey];
[likeActivity setObject:[photo objectForKey:kPTKPhotoUserKey] forKey:kPTKActivityFromUserKey];
[likeActivity setObject:photo forKey:kPTKActivityPhotoKey];
PFACL *likeACL = [PFACL ACLWithUser:[PFUser currentUser]];
[likeACL setPublicReadAccess:YES];
[likeACL setWriteAccess:YES forUser:[photo objectForKey:kPTKPhotoUserKey]];
likeActivity.ACL = likeACL;
[likeActivity saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if (completionBlock) {
completionBlock(succeeded,error);
}
// refresh cache
PFQuery *query = [TKUtility queryForActivitiesOnPhoto:photo cachePolicy:kPFCachePolicyNetworkOnly];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
NSMutableArray *likers = [NSMutableArray array];
NSMutableArray *commenters = [NSMutableArray array];
BOOL isLikedByCurrentUser = NO;
for (PFObject *activity in objects) {
if ([[activity objectForKey:kPTKActivityTypeKey] isEqualToString:kPTKActivityTypeKey] && [activity objectForKey:kPTKActivityFromUserKey]) {
[likers addObject:[activity objectForKey:kPTKActivityFromUserKey]];
} else if ([[activity objectForKey:kPTKActivityTypeKey] isEqualToString:kPTKActivityTypeComment] && [activity objectForKey:kPTKActivityFromUserKey]) {
[commenters addObject:[activity objectForKey:kPTKActivityFromUserKey]];
}
if ([[[activity objectForKey:kPTKActivityFromUserKey] objectId] isEqualToString:[[PFUser currentUser] objectId]]) {
if ([[activity objectForKey:kPTKActivityTypeKey] isEqualToString:kPTKActivityTypeKey]) {
isLikedByCurrentUser = YES;
}
}
}
[[TKCache sharedCache] setAttributesForPhoto:photo likers:likers commenters:commenters likedByCurrentUser:isLikedByCurrentUser];
}
[[NSNotificationCenter defaultCenter] postNotificationName:TKUtilityUserLikedUnlikedPhotoCallbackFinishedNotification object:photo userInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:succeeded] forKey:PTKPhotoDetailsViewControllerUserLikedUnlikedPhotoNotificationUserInfoLikedKey]];
}];
}];
}];
}
+ (void)unlikePhotoInBackground:(id)photo block:(void (^)(BOOL succeeded, NSError *error))completionBlock {
PFQuery *queryExistingLikes = [PFQuery queryWithClassName:kPTKActivityClassKey];
[queryExistingLikes whereKey:kPTKActivityPhotoKey equalTo:photo];
[queryExistingLikes whereKey:kPTKActivityTypeKey equalTo:kPTKActivityTypeKey];
[queryExistingLikes whereKey:kPTKActivityFromUserKey equalTo:[PFUser currentUser]];
[queryExistingLikes setCachePolicy:kPFCachePolicyNetworkOnly];
[queryExistingLikes findObjectsInBackgroundWithBlock:^(NSArray *activities, NSError *error) {
if (!error) {
for (PFObject *activity in activities) {
[activity delete];
}
if (completionBlock) {
completionBlock(YES,nil);
}
// refresh cache
PFQuery *query = [TKUtility queryForActivitiesOnPhoto:photo cachePolicy:kPFCachePolicyNetworkOnly];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
NSMutableArray *likers = [NSMutableArray array];
NSMutableArray *commenters = [NSMutableArray array];
BOOL isLikedByCurrentUser = NO;
for (PFObject *activity in objects) {
if ([[activity objectForKey:kPTKActivityTypeKey] isEqualToString:kPTKActivityTypeKey]) {
[likers addObject:[activity objectForKey:kPTKActivityFromUserKey]];
} else if ([[activity objectForKey:kPTKActivityTypeKey] isEqualToString:kPTKActivityTypeComment]) {
[commenters addObject:[activity objectForKey:kPTKActivityFromUserKey]];
}
if ([[[activity objectForKey:kPTKActivityFromUserKey] objectId] isEqualToString:[[PFUser currentUser] objectId]]) {
if ([[activity objectForKey:kPTKActivityTypeKey] isEqualToString:kPTKActivityTypeKey]) {
isLikedByCurrentUser = YES;
}
}
}
[[TKCache
sharedCache] setAttributesForPhoto:photo likers:likers commenters:commenters likedByCurrentUser:isLikedByCurrentUser];
}
[[NSNotificationCenter defaultCenter] postNotificationName:TKUtilityUserLikedUnlikedPhotoCallbackFinishedNotification object:photo userInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:PTKPhotoDetailsViewControllerUserLikedUnlikedPhotoNotificationUserInfoLikedKey]];
}];
} else {
if (completionBlock) {
completionBlock(NO,error);
}
}
}];
}
//#pragma mark Facebook
//
//+ (BOOL)userHasValidFacebookData:(PFUser *)user {
// // Check that PFUser has valid fbid that matches current FBSessions userId
// NSString *facebookId = [user objectForKey:kPTKUserFacebookIDKey];
// return (facebookId && facebookId.length > 0 && [facebookId isEqualToString:[[[PFFacebookUtils session] accessTokenData] userID]]);
//}
//
//+ (void)processFacebookProfilePictureData:(NSData *)newProfilePictureData {
// NSLog(@"Processing profile picture of size: %@", @(newProfilePictureData.length));
// if (newProfilePictureData.length == 0) {
// return;
// }
//
// UIImage *image = [UIImage imageWithData:newProfilePictureData];
//
// //Using a JPEG for larger pictures
// UIImage *mediumImage = [image thumbnailImage:280 transparentBorder:0 cornerRadius:0 interpolationQuality:kCGInterpolationHigh];
// UIImage *smallRoundedImage = [image thumbnailImage:64 transparentBorder:0 cornerRadius:0 interpolationQuality:kCGInterpolationLow];
//
// NSData *mediumImageData = UIImageJPEGRepresentation(mediumImage, 0.5); // using JPEG for larger pictures
// NSData *smallRoundedImageData = UIImagePNGRepresentation(smallRoundedImage);
//
// if (mediumImageData.length > 0) {
// PFFile *fileMediumImage = [PFFile fileWithData:mediumImageData];
// [fileMediumImage saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
// if (!error) {
// [[PFUser currentUser] setObject:fileMediumImage forKey:kPTKUserProfilePicMediumKey];
// [[PFUser currentUser] saveInBackground];
// }
// }];
// }
//
// if (smallRoundedImageData.length > 0) {
// PFFile *fileSmallRoundedImage = [PFFile fileWithData:smallRoundedImageData];
// [fileSmallRoundedImage saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
// if (!error) {
// [[PFUser currentUser] setObject:fileSmallRoundedImage forKey:kPTKUserProfilePicMediumKey];
// [[PFUser currentUser] saveInBackground];
// }
// }];
// }
// NSLog(@"Processed profile picture");
//}
+(BOOL)userHasProfilePictures:(PFUser *)user
{
PFFile *profilePictureMedium = [user objectForKey:kPTKUserProfilePicMediumKey];
PFFile *profilePictureSmall = [user objectForKeyedSubscript:kPTKUserProfilePicSmallKey];
return (profilePictureMedium && profilePictureSmall);
}
+ (UIImage *)defaultProfilePicture {
return [UIImage imageNamed:@"AvatarPlaceholder.png"];
}
#pragma mark Display Name
+ (NSString *)firstNameForDisplayName:(NSString *)displayName {
if (!displayName || displayName.length == 0) {
return @"Someone";
}
NSArray *displayNameComponents = [displayName componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSString *firstName = [displayNameComponents objectAtIndex:0];
if (firstName.length > 100) {
// truncate to 100 so that it fits in a Push payload
firstName = [firstName substringToIndex:100];
}
return firstName;
}
#pragma mark User Following
+ (void)followUserInBackground:(PFUser *)user block:(void (^)(BOOL, NSError *))completionBlock
{
if ([[user objectId] isEqualToString:[[PFUser currentUser] objectId]]){
return;
}
PFObject *followActivity = [PFObject objectWithClassName:kPTKActivityClassKey];
[followActivity setObject:[PFUser currentUser] forKey:kPTKActivityFromUserKey];
[followActivity setObject:user forKey:kPTKActivityToUserKey];
[followActivity setObject:kPTKActivityTypeFollow forKey:kPTKActivityTypeKey];
PFACL *followACL = [PFACL ACLWithUser:[PFUser currentUser]];
[followACL setPublicReadAccess:YES];
followActivity.ACL = followACL;
[followActivity saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if (completionBlock)
{
completionBlock(succeeded, error);
}}];
[[TKCache sharedCache] setFollowStatus:YES user:user];
}
+(void)followUserEventually:(PFUser *)user block:(void (^)(BOOL, NSError *))completionBlock
{
if ([[user objectId] isEqualToString:[[PFUser currentUser] objectId]]){
return;
}
PFObject *followActivity = [PFObject objectWithClassName:kPTKActivityClassKey];
[followActivity setObject:[PFUser currentUser] forKey:kPTKActivityFromUserKey];
[followActivity setObject:user forKey:kPTKActivityToUserKey];
[followActivity setObject:kPTKActivityTypeFollow forKey:kPTKActivityTypeKey];
PFACL *followACL = [PFACL ACLWithUser:[PFUser currentUser]];
[followACL setPublicReadAccess:YES];
followActivity.ACL = followACL;
[followActivity saveEventually:completionBlock];
[[TKCache sharedCache] setFollowStatus:YES user:user];
}
+(void)followUsersEventually:(NSArray *)users block:(void (^)(BOOL, NSError *))completionBlock
{
for (PFUser *user in users) {
[TKUtility followUserEventually:user block:completionBlock];
[[TKCache sharedCache] setFollowStatus:YES user:user];
}
}
+(void)unfollowUserEventually:(PFUser *)user
{
PFQuery *query = [PFQuery queryWithClassName:kPTKActivityClassKey];
[query whereKey:kPTKActivityFromUserKey equalTo:[PFUser currentUser]];
[query whereKey:kPTKActivityToUserKey equalTo:user];
[query whereKey:kPTKActivityTypeKey equalTo:kPTKActivityTypeFollow];
[query findObjectsInBackgroundWithBlock:^(NSArray *followActivities, NSError *error) {
if (!error){
for (PFObject *followActivity in followActivities) {
[followActivity deleteEventually];
}
}
}];
[[TKCache sharedCache] setFollowStatus:NO user:user];
}
+(void)unfollowUsersEventually:(NSArray *)users
{
PFQuery *query = [PFQuery queryWithClassName:kPTKActivityClassKey];
[query whereKey:kPTKActivityFromUserKey equalTo:[PFUser currentUser]];
[query whereKey:kPTKActivityToUserKey containedIn:users];
[query whereKey:kPTKActivityTypeKey equalTo:kPTKActivityTypeFollow];
[query findObjectsInBackgroundWithBlock:^(NSArray *activities, NSError *error) {
for (PFObject *activity in activities) {
[activity deleteEventually];
}
}];
for (PFUser *user in users) {
[[TKCache sharedCache] setFollowStatus:NO user:user];
}
}
//#pragma mark Activities
//
+ (PFQuery *)queryForActivitiesOnPhoto:(PFObject *)photo cachePolicy:(PFCachePolicy)cachePolicy {
PFQuery *queryLikes = [PFQuery queryWithClassName:kPTKActivityClassKey];
[queryLikes whereKey:kPTKActivityPhotoKey equalTo:photo];
[queryLikes whereKey:kPTKActivityTypeKey equalTo:kPTKActivityTypeKey];
PFQuery *queryComments = [PFQuery queryWithClassName:kPTKActivityClassKey];
[queryComments whereKey:kPTKActivityPhotoKey equalTo:photo];
[queryComments whereKey:kPTKActivityTypeKey equalTo:kPTKActivityTypeComment];
PFQuery *query = [PFQuery orQueryWithSubqueries:[NSArray arrayWithObjects:queryLikes,queryComments,nil]];
[query setCachePolicy:cachePolicy];
[query includeKey:kPTKActivityFromUserKey];
[query includeKey:kPTKActivityPhotoKey];
return query;
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment