设备上的 WebRequest (AFNetworking) 时 TableView 无响应,但在模拟器中正常 + MagicalRecord 问题

Posted

技术标签:

【中文标题】设备上的 WebRequest (AFNetworking) 时 TableView 无响应,但在模拟器中正常 + MagicalRecord 问题【英文标题】:Unresponsive TableView while WebRequest (AFNetworking) on device, but ok in simulator + MagicalRecord issue 【发布时间】:2012-12-09 03:17:04 【问题描述】:

我有一个应用程序,它使用 AFNetworking 从 Web 服务检索 json(员工工作计划)并将它们显示在表格视图中。

我有我的 webservice 类来处理请求,一旦完成,它将这些数据存储到 coredata 中(我这里还有一个问题,我使用 magicRecord 并且数据不会持久化,我不'不明白为什么)然后回调它的委托(我的 tableViewController)告诉它它已经完成了,所以这可以将工作计划加载到单元格中。

WebServiceClient.m

NSURL *url = [NSURL URLWithString:stringUrl];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
    success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) 
    
        NSArray *workSchedules = [[[NSSet alloc] initWithArray:JSON] allObjects];
        NSManagedObjectContext *context = [NSManagedObjectContext MR_contextForCurrentThread];
        Workschedule *workscheduleEntity = nil;
        NSError *error = nil;
        for (NSDictionary *web_workschedule in workSchedules) 
        //Inside this method I create other entities that will hydrate my workschedule entity, and it is done using the MR_CreateInContext
          workscheduleEntity = [Workschedule workScheduleFromJSONDictionary:web_workschedule  withError:&error];
          [context MR_save];
        
        if([self.delegate respondsToSelector:@selector(workSchedules)])
           [self.delegate workSchedules];
        
     
    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) 
        LOG_ERROR(2,@"Received an HTTTP %d:", response.statusCode);
        LOG_ERROR(2,@"The error was: %@", error);
        if([self.delegate respondsToSelector:@selector(workSchedules:)])
        [self.delegate workSchedules:nil];//return error
    ];
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
[operationQueue addOperation:operation]; 

PendingWorkscheduleViewController.m

- (void)viewDidLoad

    [super viewDidLoad];
    [self.webServiceClient getMockedWorkSchedulesForEmployee:[NSNumber numberWithInt:1]];
    [self workSchedules];


-(void)workSchedules

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"pending == YES"];
    NSArray *pendingWorkSchedules = [Workschedule MR_findAllWithPredicate:predicate];
    self.pendingWorkSchedules = pendingWorkSchedules;
    [self.tableView reloadData]; 

我的问题是,当我在处理请求时运行它时,UI 没有响应(这是一个非常短暂的时间,但如果请求增加......)所以如果我加载表格视图并立即尝试滚动或单击后退按钮,它只是忽略它,因为它是“冻结”的。这种行为在我的 iphone 4s 上。在模拟器上,这工作很好,我无法理解为什么会这样。我试图调用“[self.webServiceClient getMockedWorkSchedulesForEmployee:[NSNumber numberWithInt:1]];”在使用 GCD 的队列中,我尝试使用 performSelectorInBackground: WithObject: etc 但仍然相同(尽管使用最后一种方法似乎更有效,但这是一种印象,仅在模拟器上,设备上没有变化)。

就magicRecord而言,我将提出单独的问题。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

修复它。问题是成功块在主线程上运行! (我不明白)。我只是在成功块中使用 GCD,并使用后台队列来处理数据,并使用主队列将这些数据存储在核心数据中。

至于神奇的记录问题,我需要保存“nestedContext”。

大家干杯。

【讨论】:

这就解释了为什么在模拟器中没问题:你的电脑比你的 ios 设备快得多! 是的,我添加了一些额外的无用代码以使其“等待”更长的时间并验证它是否会在模拟器中执行相同的操作。 (在我发现问题之前)。 您好,我也遇到了同样的问题,您能分享一下您是如何解决这个问题的吗?非常感谢,提前谢谢。

以上是关于设备上的 WebRequest (AFNetworking) 时 TableView 无响应,但在模拟器中正常 + MagicalRecord 问题的主要内容,如果未能解决你的问题,请参考以下文章

.NET 3.5CF WebRequest 到 Slim 框架

WebRequest 奇怪的 NotFound 错误

PowerShell WebRequest:发送时发生意外错误

c# winform中异步执行WebRequest后返回值

WebRequest.DefaultWebProxy 和 WebRequest.GetSystemWebProxy() 有啥区别?

webRequest