0

我目前有一个 UITableView,它向我显示了从 facebook 派生的具有特定事件的人员列表。我目前在获取和插入核心数据时没有问题,但更新 tableview 所需的时间可能约为 12 秒

用户首先选择一个事件

然后进入编辑画面

将事件类型更改为周年纪念日(气球)

我以同样的方式导航回家,但问题出在这里,我的 tableview 可能在 12 秒后更新为周年纪念类型事件。为什么更新 tableview 有这么多延迟

cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{
static NSString *CellIdentifier = @"EventCell";

//testing


EventCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
PersonEvent *currentEvent = [self.eventsArray objectAtIndex:indexPath.row];

[cell configureForEvent:currentEvent];
//  NSLog(@"Event date is %@",[currentEvent.eventDate description]);
// NSLog(@"Time interval %f",[currentEvent timeDifference]);
//[self configureCell:cell atIndexPath:indexPath];
return cell;

}

配置事件

-(void)configureForEvent:(PersonEvent*)theEvent
 {

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
    //performing async operation her

    dispatch_sync(dispatch_get_main_queue(), ^{

        personLabel.text = theEvent.name;
        dateLabel.text = [theEvent getFriendlyDate];
        //  NSInteger theAge = [theEvent getAge];
        if (theEvent.hasAge) {
            //  NSLog(@"Have to load the age as well for %@",theEvent.name);
            ageLabel.text = [NSString stringWithFormat:@"%d yrs",[theEvent getAge] ];
        }
        else{
            ageLabel.text = @"";
        }

        //ageLabel.text = [NSString stringWithFormat:@"%d yrs",[theEvent getAge] ];
        reminderImage.image = [theEvent.theReminders count] == 0?[UIImage imageNamed:@"reminder.png"]:nil;
        // Have to configure event type image based on the event type..
        //NSLog(@"Event image %@",[eventTypeImagesArray objectAtIndex:theEvent.eventType]);
        eventTypeImage.image = [UIImage imageNamed:[eventTypeImagesArray objectAtIndex:theEvent.eventType]];;

        // Update UI
        // Example:
        // self.myLabel.text = result;
    });
});



}

在 initWithNibName 上调用的 loadAllEventz 方法

-(void)loadAllEventz
{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"PersonEvent" inManagedObjectContext:appDelegate.managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"eventDate" ascending:YES];
[fetchRequest setSortDescriptors:@[sortDescriptor]];

NSError *error;
    allEventsArray = [appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error];
NSLog(@"%@",allEventsArray); 
//  [appDelegate.managedObjectContext executeFetchRequestAsynchronously:fetchRequest delegate:self];


 }

PersonEvent 类是 NSManagedObject 的子类

4

3 回答 3

0

UITableView 工作得很快。问题不在 tableView 中。您最好测量“执行异步操作”的经过时间。

于 2013-05-14T11:46:13.737 回答
0

也许我看错了,但是当更新事件时,您是否将更新发送到 Web 服务,然后在返回时从 Web 服务中检索TableView?如果是这样,那似乎效率很低。既然您知道已更改的数据,为什么不使用delegate方法(或unwind segue)将更新发送回TableView,然后在后台将更新发送到 Web 服务?除非您需要您还没有的信息,否则没有理由再次轮询 Web 服务。从您的流程来看,您似乎正在重新轮询 Web 服务以获取您已经知道的更新。

此外,在图像上。它看起来确实像您用于提醒的一小部分静态图像。为什么不下载一次(在应用程序初始加载时),然后使用本地存储的,这样您就不会每次都获取它们。

于 2013-05-14T10:16:14.967 回答
0

表视图性能取决于数据源方法。

在您的代码中,您实现了 GCD,但运行是在主线程本身中完成的!

加载缓慢的问题是图像加载。在插入图像时使用 GCD 或使用 Asynchimageview /AFnetworking extension、SDWebimageView 等类

于 2013-05-14T09:56:42.113 回答