0
我正在使用CoreData從Web服務中提取數據,然後將其放入tableview中。當視圖第一次加載數據出現在tableview中時,但在一秒之後它全部消失。這可能與刪除代碼有關(在我上傳新數據之前,我使用它來清除CoreData實體),因爲沒有該代碼的tableview工作。我已經包含了我用來設置數據的所有代碼,將它加載到表視圖中,刪除它並重新加載它。UITableView顯示數據,然後立即變爲空白
該代碼可以在下面找到...任何幫助表示讚賞。謝謝。
- (void)viewDidLoad {
[super viewDidLoad];
[self findSelectedCategories];
[self setUpData];
}
- (void) findSelectedCategories {
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"ExploreCat"];
selectedCategoriesFilter = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
}
- (void) deleteEntityData {
NSLog(@"Delete code being called");
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
[fetch setEntity:[NSEntityDescription entityForName:@"ExploreView" inManagedObjectContext:context]];
[fetch setIncludesPropertyValues:NO];
NSError *error = nil;
NSArray *entities = [context executeFetchRequest:fetch error:&error];
for (NSManagedObject * exploreView in entities) {
[context deleteObject:exploreView];
if (![context save:&error]) {
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
};
}
[self.tableView reloadData];
}
- (void) setUpData {
//Create the string with the userID for the get request here
NSLog(@"SetUpData being called");
//Initialize AFHTTPRequestOperationManager with Dribbble API base URL
_operationManager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://www.karmo.com/explore/index"]];
[_operationManager GET:@"?user_id=5332bb35c9f9550b008ed49c" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
//Success - Runs if connection is made and data recieved
[self deleteEntityData];
//Extrat parsed JSON file into objects to prepare for Core Data import -- Should verify if I can skip and go directly into Core Data
for (int i = 0; i < [[responseObject valueForKey:@"belief"] count]; i++) {
NSString * topicID = [[[[responseObject valueForKey:@"belief"] valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"_id"];
NSString * title = [[[[responseObject valueForKey:@"belief"] valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"title"];
NSString *body = [[[[responseObject valueForKey:@"belief"] valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"body"];
NSString * category = [[[[responseObject valueForKey:@"belief"] valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"category"];
NSNumber * nFor = @([[[[[responseObject valueForKey:@"belief"] valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"nFor"] intValue]);
NSNumber * nAgainst = @([[[[[responseObject valueForKey:@"belief"] valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"nAgainst"] intValue]);
NSNumber *totalVotes = @([nFor integerValue] + [nAgainst integerValue]);
NSString * vote = [[[responseObject valueForKey:@"belief"] objectAtIndex:i] valueForKey:@"vote"];
NSString *beliefID = [[[responseObject valueForKey:@"belief"] objectAtIndex:i] valueForKey:@"_id"];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
NSDate *createdAt = [dateFormat dateFromString:[[[[responseObject valueForKey:@"belief"] valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"createdAt"]];
NSDate *updatedAt = [dateFormat dateFromString:[[[[responseObject valueForKey:@"belief"] valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"updatedAt"]];
NSManagedObjectContext *context = [self managedObjectContext];
// Create a new managed object
NSManagedObject *newExplore = [NSEntityDescription insertNewObjectForEntityForName:@"ExploreView"
inManagedObjectContext:context];
[newExplore setValue:topicID forKey:@"topicID"];
[newExplore setValue:title forKey:@"title"];
[newExplore setValue:body forKey:@"body"];
[newExplore setValue:category forKey:@"category"];
[newExplore setValue:nFor forKey:@"nFor"];
[newExplore setValue:nAgainst forKey:@"nAgainst"];
[newExplore setValue:vote forKey:@"vote"];
[newExplore setValue:totalVotes forKey:@"totalVotes"];
[newExplore setValue:beliefID forKey:@"beliefID"];
[newExplore setValue:createdAt forKey:@"createdAt"];
[newExplore setValue:updatedAt forKey:@"updatedAt"];
// Save the object to persistent store
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}
}
for (int i = 0; i < [[responseObject valueForKey:@"topic"] count]; i++) {
NSString * topicID = [[[responseObject valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"_id"];
NSString * title = [[[responseObject valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"title"];
NSString *body = [[[responseObject valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"body"];
NSString * category = [[[responseObject valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"category"];
NSNumber * nAgainst = @([[[[responseObject valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"nAgainst"] intValue]);
NSNumber * nFor = @([[[[responseObject valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"nFor"] intValue]);
NSNumber *totalVotes = @([nFor integerValue] + [nAgainst integerValue]);
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
NSDate *createdAt = [dateFormat dateFromString:[[[responseObject valueForKey:@"topic"] objectAtIndex:i] valueForKey:@"createdAt"]];
NSManagedObjectContext *context = [self managedObjectContext];
// Create a new managed object
NSManagedObject *newExplore = [NSEntityDescription insertNewObjectForEntityForName:@"ExploreView"
inManagedObjectContext:context];
[newExplore setValue:topicID forKey:@"topicID"];
[newExplore setValue:title forKey:@"title"];
[newExplore setValue:body forKey:@"body"];
[newExplore setValue:category forKey:@"category"];
[newExplore setValue:nFor forKey:@"nFor"];
[newExplore setValue:nAgainst forKey:@"nAgainst"];
[newExplore setValue:totalVotes forKey:@"totalVotes"];
[newExplore setValue:createdAt forKey:@"createdAt"];
NSError *error = nil;
// Save the object to persistent store
if (![context save:&error]) {
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//Failure
NSLog(@"Failed to fetch shots from Karmo API!");
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Unable to Connect"
message:@"We were not able to connect to the karmo database. Some data may be out of date."
delegate:self
cancelButtonTitle:@"Ok"
otherButtonTitles: nil];
[alert show];
} ];
[self fetchData];}
- (void) fetchData {
NSLog(@"FetchData being called");
[exploreSortData removeAllObjects];
[exploreTableData removeAllObjects];
self.timeSortButton.backgroundColor = [UIColor clearColor];
self.voteSortButton.backgroundColor = [UIColor lightGrayColor];
NSMutableArray *subPredicates = [[NSMutableArray alloc] init];
// Fetch the recipes from persistent data store
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"ExploreView"];
exploreSortData = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
//Would probably need to call the category slelctions here. Use an if statment to capture so if non are seletced that all the categories are displayed
if ([selectedCategoriesFilter count] > 0) {
for (int i = 0; i < [selectedCategoriesFilter count]; i++) {
NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"category ==[c] %@",[[selectedCategoriesFilter objectAtIndex:i]valueForKey:@"categorySelected"]];
[subPredicates addObject:newPredicate];
}
NSPredicate *combinedPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];
NSArray *filterData = [[NSArray alloc]init];
filterData = [exploreSortData filteredArrayUsingPredicate:combinedPredicate];
NSSortDescriptor *voteDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"totalVotes" ascending:NO];
NSMutableArray * descriptors = [[NSArray arrayWithObjects:voteDescriptor, nil]mutableCopy];
exploreTableData = [[filterData sortedArrayUsingDescriptors:descriptors]mutableCopy];
[self.tableView reloadData];
} else {
NSSortDescriptor *voteDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"totalVotes" ascending:NO];
NSMutableArray * descriptors = [[NSArray arrayWithObjects:voteDescriptor, nil]mutableCopy];
exploreTableData = [[exploreSortData sortedArrayUsingDescriptors:descriptors]mutableCopy];
[self.tableView reloadData];
}}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if ([[[exploreTableData objectAtIndex:indexPath.row] valueForKey:@"beliefID"] isEqualToString:@"0"]) {
ExploreVoteCell *cell = (ExploreVoteCell *) [tableView dequeueReusableCellWithIdentifier:@"ExploreVote" forIndexPath:indexPath];
NSDate * topicDate = [[exploreTableData objectAtIndex:indexPath.row] valueForKey:@"createdAt"];
NSString *currentDateString;
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
currentDateString = [dateFormat stringFromDate:[NSDate date]];
NSDate *currentDate = [dateFormat dateFromString:currentDateString];
NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dayComponents = [gregorianCalendar components:NSDayCalendarUnit
fromDate:topicDate
toDate:currentDate
options:0];
NSString *dayDifference = [NSString stringWithFormat:@"%@d", [@([dayComponents day]) stringValue]];
NSString *voteCount = [[[exploreTableData objectAtIndex:indexPath.row] valueForKey: @"totalVotes"]stringValue];
[cell.topicTitle setText:[[exploreTableData objectAtIndex:indexPath.row] valueForKey:@"title"]];
[cell.votesCount setText:voteCount];
[cell.timeDayCount setText:dayDifference];
return cell;
} else {
ExploreBeliefCell *cell = (ExploreBeliefCell *) [tableView dequeueReusableCellWithIdentifier:@"ExploreBelief" forIndexPath:indexPath];
UISwipeGestureRecognizer *gesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRightChangeVote:)];
gesture.direction = UISwipeGestureRecognizerDirectionRight;
[cell addGestureRecognizer:gesture];
[cell.topicTitle setText:[[exploreTableData objectAtIndex:indexPath.row] valueForKey:@"title"]];
return cell;
}}
我在上面加上了'modalDidChange'代碼的上面的代碼塊,當我的'tableview'出現時我仍然看到同樣的東西出現。檢查我的日誌,看起來'deleteEntityData'在'setUpData'和'fetchData'之後被調用。但是,如果我在將'setUpData'中的delete方法調用到'viewDidLoad'時調用該方法,則該方法會按照正確的順序觸發(查看NSLog),但數據甚至不會出現在tableview中。思考? –
你說你給deleteEntityData添加了一個完成塊,那麼在setUpData之後如何完成?順便說一句,你爲什麼不使用fetchedResultsController? – shannoga
我相信這只是因爲我在該方法中使用了NSLog。但是向'modalDidChange'方法中添加一個NSLog,它看起來像是在正確的'CoreData'對象上調用了刪除代碼,但之後再次調用它,並返回一堆'null'值。就'fetchedResultsController'而言,我沒有理由沒有使用它,除此之外,我對iOS編程並不熟悉,並且可能更適合使用數組。你認爲轉換它可以幫助解決問題嗎? –