【问题标题】:PFRelation Deleting One Object From A PFRelation, Not AllPFRelation 从 PFRelation 中删除一个对象,而不是全部
【发布时间】:2015-07-01 04:01:22
【问题描述】:

正在发生的事情的说明:用户在另一个视图中添加了一项工作作为他们的最爱。现在,用户位于收藏夹选项卡中,并决定不再希望该工作成为他们的最爱之一,因此他们滑动以删除该工作。他们点击删除按钮并发生以下错误......代码按原样工作,但它也会删除用户保存为收藏夹的每一个作业,而不是只删除一个作业。

我的代码还提醒我:

警告:正在主线程上执行长时间运行的操作。 中断 warnBlockingOperationOnMainThread() 进行调试。

#import "JobDetailViewController.h"
#import "MyFavoritesTableViewController.h"
#import "Parse/Parse.h"
#import "Job.h"
#import "JobListViewController.h"

@interface MyFavoritesTableViewController ()

@property (nonatomic, strong) NSString *mainTitle;
@property (nonatomic, strong) NSString *subTitle;

@end

@interface MyFavoritesTableViewController ()

@end

@implementation MyFavoritesTableViewController
{}

@synthesize mainTitle;
@synthesize subTitle;



- (id)initWithCoder:(NSCoder *)aCoder
{
    self = [super initWithCoder:aCoder];
    if ([PFUser currentUser]) {
        // Custom the table

        // The className to query on
        self.parseClassName = @"Jobs";

        // The key of the PFObject to display in the label of the default cell style
        self.textKey = @"Position";

        // Whether the built-in pull-to-refresh is enabled
        self.pullToRefreshEnabled = YES;

        // Whether the built-in pagination is enabled
        self.paginationEnabled = YES;

        // The number of objects to show per page
        self.objectsPerPage = 30;
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];


}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];


}
- (void)objectsWillLoad {
    [super objectsWillLoad];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    [self.tableView reloadData];

}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object: (PFObject *)object
{
    static NSString *myJobsTableIdentifier = @"myFavsCell";


    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:myJobsTableIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:myJobsTableIdentifier];
    }

    // Configure the cell
    PFFile *thumbnail = [object objectForKey:@"imageFile"];
    PFImageView *thumbnailImageView = (PFImageView*)[cell viewWithTag:100];
    thumbnailImageView.image = [UIImage imageNamed:@"AppIcon.png"];
    thumbnailImageView.file = thumbnail;
    [thumbnailImageView loadInBackground];

    UILabel *positionLabel = (UILabel*) [cell viewWithTag:101];
    positionLabel.text = [object objectForKey:@"Position"];
    UILabel *rotationLabel = (UILabel*) [cell viewWithTag:102];
    rotationLabel.text = [object objectForKey:@"Rotation"];
    UILabel *locationLabel = (UILabel*) [cell viewWithTag:103];
    locationLabel.text = [object objectForKey:@"Location"];
    UILabel *typeLabel = (UILabel*) [cell viewWithTag:104];
    typeLabel.text = [object objectForKey:@"Type"];
    return cell;

}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showDetailedView"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

        Job *job = [[Job alloc] init];

        JobDetailViewController *destViewController = segue.destinationViewController;

        PFObject *object = [self.objects objectAtIndex:indexPath.row];
        job.position = [object objectForKey:@"Position"];
        job.poc = [object objectForKey:@"POC"];
        job.email = [object objectForKey:@"Email"];
        job.phone = [object objectForKey:@"Phone"];
        job.apply = [object objectForKey:@"Apply"];
        job.imageFile = [object objectForKey:@"imageFile"];
        job.rotation = [object objectForKey:@"Rotation"];
        job.location = [object objectForKey:@"Location"];
        job.type = [object objectForKey:@"Type"];
        job.clearance = [object objectForKey:@"Clearance"];
        job.job_description = [object objectForKey:@"Job_Description"];
        job.qualifications = [object objectForKey:@"Qualifications"];
        job.originalJob = object;
        destViewController.job = job;
    }
}

#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    if ([self.objects count] == indexPath.row) {
        [self loadNextPage];
    } else {
        PFObject *photo = [self.objects objectAtIndex:indexPath.row];
        NSLog(@"%@", photo);

        // Do something you want after selected the cell
    }
}

- (PFQuery *)queryForTable

{
    PFUser *user = [PFUser currentUser];
    PFRelation *relation = [user relationForKey:@"Favorites"];
    PFQuery *myquery = [relation query];
    if (self.pullToRefreshEnabled) {
        myquery.cachePolicy = kPFCachePolicyNetworkOnly;
    }
    return myquery;

}

#pragma mark - DeleteJobViewDelegate


    - (void)tableView:(UITableView *)tableView
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath {
    PFUser *user = [PFUser currentUser];
    PFRelation *relation = [user relationForKey:@"Favorites"];
    PFQuery *myquery = [relation query];
    NSArray *array = [myquery findObjects];
        for (PFObject *object in array)
        {
                [relation removeObject:object];
        }

    [user saveInBackground];

    [self.tableView reloadData];
        [self loadObjects];
    }

    @end

【问题讨论】:

  • 出于某种原因,如果您从收藏夹中删除一项工作,则会删除收藏夹中的所有工作。
  • 在您的循环中,您将全部删除。使用 saveEventually 将消除错误问题。
  • @DogCoffee 我改变了 [user saveInBackground];到[用户最终保存];我仍然收到错误消息。至于循环,您指的是 NSArray 下的“for”语句吗?
  • @DogCoffee 调试管理器说错误来自 NSArray *array = [myquery findObjects];我该如何解决这个问题?
  • 使用这个,query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in if error != nil { return } }

标签: ios objective-c xcode uitableview parse-platform


【解决方案1】:

问题是您要从关系中删除所有对象:

NSArray *array = [myquery findObjects];
for (PFObject *object in array)
{
    [relation removeObject:object];
}

您的代码正在执行您的数组并从关系中删除每个对象。

您要做的是仅删除该单元格的作业。您可以使用indexPath

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    PFUser *user = [PFUser currentUser];
    PFRelation *relation = [user relationForKey:@"Favorites"];

    [relation removeObject:[self.objects objectAtIndex:indexPath.row]];

    [user saveInBackground];

    [self.tableView reloadData];
    [self loadObjects];
}

你的第二个问题:

警告:正在主线程上执行长时间运行的操作。中断 warnBlockingOperationOnMainThread() 进行调试。

该警告是因为findObjects 是同步调用。您应该改用findObjectsInBackground。但如果你做出我上面给出的改变,你就不需要它了。

【讨论】:

  • 可能是一个愚蠢的问题,但我收到指向 [relation removeObject:[self.objects objectAtIndexPath:indexPath.row]] 的红色错误;说“'NSArray'没有可见的@interface声明选择器'objectAtIndexPath'”
  • 对不起,我的错。请参阅更新的答案。它应该是 objectAtIndex 而不是 objectAtIndexPath
  • 哇,我不敢相信我已经为“DAYS”工作而你在这么短的时间内解决了它!太棒了!谢谢!
  • 很高兴我能帮上忙。干杯...快乐的编码。
猜你喜欢
  • 2014-09-06
  • 2015-11-10
  • 2015-02-04
  • 2015-03-09
  • 2015-02-18
  • 2016-02-09
  • 2015-05-09
  • 1970-01-01
  • 2015-08-24
相关资源
最近更新 更多