在后台获取Core Data对象并重新加载TableView

时间:2014-04-18 09:28:14

标签: objective-c uitableview core-data asynchronous afnetworking

我想在后台加载Core Data对象,完成后应重新加载TableView。 我不喜欢在tableviewcontroller类中执行所有这些操作,因此我创建了第二个“InternetConnection”类。 InternetConnection类有一个名为“getNewEventsWithDateSpan”的方法

//The method call in TableViewController.m
    InternetConnection *connectionForWeekEvents = [[InternetConnection alloc]init];
    connectionForWeekEvents.delegate = self;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    [connectionForWeekEvents getNewEventsWithDateSpan: [self.date_span intValue]];
});

在这个方法中,我构建了一个AFURLSessionManager(我正在使用AFNetworking 2.0)并执行dataTaskWithRequest,当它完成时我调用了一个我在TableViewController.m中实现的委托方法

//Method in InternetConnection.m

-(void)getNewEventsWithDateSpan:(NSInteger)datespan{
//#Doing Init Stuff
 AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:self.sessionConfiguration];
[[manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {

// #I store the receive data in core data
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;

    if (httpResponse.statusCode ==200) {
        [delegate dataComplete]; //<- Delegate Method
    }else {
        [delegate errorLoading]; //<- Delegate Method
    }
}
}

最后,我重新加载TableView。

-(void)dataComplete{
NSLog(@"All Datas were load");

dispatch_after(0, dispatch_get_main_queue(), ^{

    _fetchedResultsController = nil;
    [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
});

这种方式有效,我得到了正确的结果,但这是一个很好的方法吗?我可能需要加载更多数据,并且可能需要一段时间才能获取所有数据。用户可以离开tableview并切换到另一个viewcontroller。委托方法有问题吗?我应该采取另一种方式吗?

对于建议,我将非常感激!

0 个答案:

没有答案