-2

我正在使用下载大量数据AFnetworking并将其存储到本地数据库中并显示在 tableview 中,当我下载较少的数据时,表很快加载但是当我下载大量数据并存储它时会卡住一段时间,因为所有操作都在主线程上。

有人可以告诉我如何在后台执行所有这些过程,以便用户可以毫无问题地使用该应用程序。

代码:

-(void) AddRecentCallLogs:(NSDictionary *)args :(NSString * ) type{

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{


    if([type isEqualToString:@"dailed"])
    {
        NSString *phoneNumber=[args objectForKey:@"destination_number"];;
        NSString *date=[args objectForKey:@"added_date_time"];
        NSString *name=[self getName:phoneNumber];

        if(name==NULL)
        {
            name=@"NOT_FOUND";
        }
       appDelegate=(AppDelegate *)[[UIApplication sharedApplication]delegate];

        [appDelegate SetPhoneLogs:name :phoneNumber :date :@"Dailed"];
        [self.tableView reloadData];

    }
    else
    {
        NSString *phoneNumber=[args objectForKey:@"source_number"];;
        NSString *date=[args objectForKey:@"added_date_time"];
        NSString *name=[self getName:phoneNumber];

        if(name==NULL)
        {
            name=@"NOT_FOUND";
        }
        appDelegate=(AppDelegate *)[[UIApplication sharedApplication]delegate];

        [appDelegate SetPhoneLogs:name :phoneNumber :date :@"Received"];

        [self.tableView reloadData];
    }

    });
}

在其他函数中,我调用了上述方法:

  AFJSONRequestOperation *operation1 = [AFJSONRequestOperation JSONRequestOperationWithRequest:request1 success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

        resp = [JSON objectForKey:@"result"];
        //NSLog(@"%@-- %@",JSON,resp);

        self.recent_calllogs = [JSON objectForKey:@"log"];

        if(recent_calllogs.count<=0)
            [SVProgressHUD dismiss];

        for(NSDictionary *info in recent_calllogs)
        {
            [self AddRecentCallLogs:info :@"received"];
        }

        NSString *last_record=[JSON objectForKey:@"lastid"];

        if(last_record!=NULL)
        {
            [[NSUserDefaults standardUserDefaults]
             setObject:last_record forKey:@"recent-R"];

//            NSString *savedValue = [[NSUserDefaults standardUserDefaults]stringForKey:@"recent-R"];


            //NSLog(@"saved:%@",savedValue);
        }



    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
        NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);


    }];
4

1 回答 1

-1

在服务器上实现分页器,在设备上实现 Pull-to-refresh,看看https://github.com/instructure/CKRefreshControl

一次加载大数据太耗时了,原因有两个:

  • 下载数据并解析
  • 将其保存到数据库(根据我的经验,8MB 的 json 文本(30k 个对象)可以保存大约 30-50 秒)

  • (可选)如果您在表格视图中为表格行使用动态高度,这也非常耗时,因为系统会在渲染表格之前调用计算每行高度的方法。

于 2013-09-23T03:42:41.293 回答