Developer Area

Show
Ignore:
Timestamp:
03/16/09 15:45:42 (6 years ago)
Author:
henri
Message:

Major refactoring of data handling to solve synch issue

Location:
apps/iphone/my.tel/trunk/Classes
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • apps/iphone/my.tel/trunk/Classes/GroupFriendsController.h

    r249 r273  
    5050- (void)getGroupFriends; 
    5151- (void)getAllFriends; 
    52 - (void)setSelectedFriends; 
    5352- (void)syncGroupFriends; 
    5453- (void)addFriends:(NSArray *)friendsIdList; 
  • apps/iphone/my.tel/trunk/Classes/GroupFriendsController.m

    r266 r273  
    66//  Copyright 2009 __MyCompanyName__. All rights reserved. 
    77// 
    8 // TODO: Don't call getAllFriends until the guy chooses to edit. 
    9 // When he clicks edit, run an activity indicator and get all friends (if not cached) synchronously 
    10 // Then set selectedFriends and show the table 
    11 // Also implement the buttons UI 
    128 
    139#import "GroupFriendsController.h" 
     
    3430        [gFC initVars]; 
    3531        gFC.theGroup = aGroup; 
    36         [gFC getGroupFriends]; 
    3732        [gFC getAllFriends]; 
    3833        return gFC; 
     
    5247        [deleteButton addTarget:self action:@selector(didClickDelete:) forControlEvents:UIControlEventTouchUpInside]; 
    5348        deleteButton.autoresizingMask = (UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight); 
    54          
     49                 
    5550        nTrue = [[NSNumber numberWithBool:TRUE] retain]; 
    5651        nFalse = [[NSNumber numberWithBool:FALSE] retain]; 
     
    139134#endif 
    140135        if ([[parsedJson valueForKey:@"success"] integerValue] == 1) { 
    141                 if (friendsArray) 
    142                         [friendsArray release]; 
     136                if (!selectedFriends) { 
     137                        selectedFriends = [[NSMutableArray arrayWithCapacity:[allFriendsArray count]] retain]; 
     138                } else { 
     139                        [selectedFriends removeAllObjects]; 
     140                } 
     141                if (!friendsArray) { 
     142                        friendsArray = [[NSMutableArray arrayWithCapacity:[allFriendsArray count]] retain]; 
     143                } else { 
     144                        [friendsArray removeAllObjects]; 
     145                } 
    143146                if ([parsedJson objectForKey:@"friendList"] != [NSNull null]) { 
    144                         friendsArray = [[parsedJson objectForKey:@"friendList"] retain]; 
     147                        // set all selected friends 
     148                        NSMutableArray *groupFriendsIds = [NSMutableArray arrayWithCapacity:[allFriendsArray count]]; 
     149                        NSEnumerator *allEnum = [allFriendsArray objectEnumerator]; 
     150                        NSEnumerator *fEnum = [[parsedJson objectForKey:@"friendList"] objectEnumerator]; 
     151                        NSDictionary *aFriend; 
     152                        while ((aFriend = [fEnum nextObject])) { 
     153                                [groupFriendsIds addObject:(NSString *)[aFriend objectForKey:@"id"]]; 
     154                        } 
     155                        while ((aFriend = [allEnum nextObject])) { 
     156                                if ([groupFriendsIds containsObject:[aFriend objectForKey:@"id"]]) { 
     157                                        [selectedFriends addObject:nTrue]; 
     158                                        [friendsArray addObject:aFriend]; 
     159                                } else { 
     160                                        [selectedFriends addObject:nFalse]; 
     161                                } 
     162                        } 
     163                         
    145164                } else { 
    146                         friendsArray = [[NSMutableArray array] retain]; 
    147                 } 
     165                        // no friends, set selectedFriends to be all nFalse 
     166                        NSUInteger i, count = [allFriendsArray count]; 
     167                        for (i = 0; i < count; i++) { 
     168                                [selectedFriends addObject:nFalse]; 
     169                        } 
     170                } 
     171                [theTable reloadData];   
     172                self.navigationItem.rightBarButtonItem.enabled = YES; 
    148173        } else { 
    149174                [Group throwJsonErrorAlert:parsedJson]; 
    150175        } 
    151         [theTable reloadData];   
    152176} 
    153177 
     
    160184                        [allFriendsArray release]; 
    161185                if ([parsedJson objectForKey:@"friendList"] != [NSNull null]) { 
    162                         allFriendsArray = [[parsedJson objectForKey:@"friendList"] retain]; 
     186                        allFriendsArray = [[NSMutableArray arrayWithArray:[parsedJson objectForKey:@"friendList"]] retain]; 
    163187                }else { 
    164188                        allFriendsArray = [[NSMutableArray array] retain]; 
    165189                } 
     190                [self getGroupFriends]; 
    166191        } else { 
    167192                [Group throwJsonErrorAlert:parsedJson]; 
    168         } 
    169         [self setSelectedFriends]; 
    170         if (theTable.editing) { 
    171                 [theTable reloadData]; 
    172193        } 
    173194} 
     
    233254        [conn performLookup:TRUE]; 
    234255        [requestData release];   
    235 } 
    236  
    237 - (void)setSelectedFriends { 
    238         // Array of active friends as NSNumber (actually BOOL) flags, which match the list of all friends 
    239         if (selectedFriends) { 
    240                 [selectedFriends release]; 
    241         } 
    242         selectedFriends = [[NSMutableArray arrayWithCapacity:[allFriendsArray count]] retain]; 
    243         NSMutableArray *groupFriendsIds = [NSMutableArray arrayWithCapacity:[allFriendsArray count]]; 
    244         NSEnumerator *allEnum = [allFriendsArray objectEnumerator]; 
    245         NSEnumerator *fEnum = [friendsArray objectEnumerator]; 
    246         NSDictionary *aFriend; 
    247         while ((aFriend = [fEnum nextObject])) { 
    248                 [groupFriendsIds addObject:(NSString *)[aFriend objectForKey:@"id"]]; 
    249         } 
    250         while ((aFriend = [allEnum nextObject])) { 
    251                 if ([groupFriendsIds containsObject:[aFriend objectForKey:@"id"]]) { 
    252                         [selectedFriends addObject:nTrue]; 
    253                 } else { 
    254                         [selectedFriends addObject:nFalse]; 
    255                 } 
    256         } 
    257256} 
    258257 
     
    362361        } else { 
    363362                self.navigationItem.rightBarButtonItem = [self editButtonItem]; 
     363                // disable editing until we've loaded the data 
     364                self.navigationItem.rightBarButtonItem.enabled = NO; 
    364365                deleteButton.enabled = YES; 
    365366        } 
     
    375376- (void)dealloc { 
    376377    [super dealloc]; 
     378        if (selectedFriends) 
    377379        [selectedFriends release]; 
    378380        if (friendsArray) 
     
    459461        // If editing, show all the friends, with the ones currently selected with the checkmark 
    460462        // If not editing, simply show all the current friends 
     463        cell.text = [[friendsArray objectAtIndex:indexPath.row] valueForKey:@"name"]; 
    461464        if (! tableView.editing) { 
    462                 cell.text = [[friendsArray objectAtIndex:indexPath.row] valueForKey:@"name"]; 
    463                 cell.accessoryType = UITableViewCellAccessoryNone; 
     465                cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    464466                cell.backgroundColor = [UIColor whiteColor]; 
    465467        } else { 
    466                 cell.text = [[allFriendsArray objectAtIndex:indexPath.row] valueForKey:@"name"]; 
    467468                if ([selectedFriends objectAtIndex:indexPath.row] == nTrue) { 
    468469                        // it's a selected friend 
     
    510511        [super setEditing:editing animated:animated]; 
    511512        if (editing) { 
     513                // Grow the friendsArray to add the objects from allFriendsArray 
    512514                theTable.editing = YES; 
    513         } else { 
     515                NSUInteger i, count = [selectedFriends count]; 
     516                NSMutableArray *insertIndexPaths = [NSMutableArray arrayWithCapacity:count]; 
     517                for (i = 0; i < count; i++) { 
     518                        if ([selectedFriends objectAtIndex:i] == nFalse) { 
     519                                [friendsArray insertObject:[allFriendsArray objectAtIndex:i] atIndex:i]; 
     520                                [insertIndexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]]; 
     521                        } 
     522                } 
     523                [theTable beginUpdates]; 
     524                [theTable insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationTop]; 
     525                [theTable endUpdates]; 
     526        } else { 
     527                // Shrink the friendsArray to remove the objects from allFriendsArray 
    514528                theTable.editing = NO; 
     529                NSUInteger i, count = [selectedFriends count]; 
     530                NSMutableArray *deleteIndexPaths = [NSMutableArray arrayWithCapacity:count]; 
     531                NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet]; 
     532                for (i = 0; i < count; i++) { 
     533                        NSLog(@"working on index: %d", i); 
     534                        if ([selectedFriends objectAtIndex:i] == nFalse) { 
     535                                [indexes addIndex:i]; 
     536                                [deleteIndexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]]; 
     537                        }                        
     538                } 
     539                [friendsArray removeObjectsAtIndexes:indexes]; 
     540                [theTable beginUpdates]; 
     541                [theTable deleteRowsAtIndexPaths:deleteIndexPaths withRowAnimation:UITableViewRowAnimationTop]; 
     542                [theTable endUpdates]; 
    515543                [self syncGroupFriends]; 
    516544        } 
    517         [theTable reloadData]; 
    518545} 
    519546 
Telnic
Search This Site
Partners
Neustar
ICANN
Main site | WHOIS | Sell .tel | FAQ | Archived Site | About Telnic | Contact Us