0

这是我的问题,我正在构建一个带有一些来自服务器的 JSON 返回的 iOS,在这里,没有问题,一切正常。

问题是当我运行程序时,需要很长时间才能将结果解析为NSMutableArray:这是日志

2013-01-10 12:03:48.627 project[5917:907] <- time begin parser
2013-01-10 12:03:48.755 project[5917:907] <- time finish parser
2013-01-10 12:03:48.756 project[5917:907] <- time begin implement arrays
2013-01-10 12:03:58.522 project[5917:907] <- time finish implement array

如您所见,实现数组真的很长。

我知道我必须使用排队和大中央调度来使我的 UI 响应,但我不知道怎么做,你能帮我做吗?

这是我的viewDidLoad方法

- (void)viewDidLoad
{
    [super viewDidLoad];

    if debug
        NSLog(@"<- time begin parser");
    endif


    NSString *URLStr = @"http://myJsonFile.json";

    NSDictionary *myDictwithReturn = [TOCJSONParser awesomeParserWithStringOfYourJSONFile:URLStr]; //really cool parser, i can put it on gitHub if you want
    NSArray *speakersArray = [myDictwithReturn objectForKey:@"speakers"];

    myArray = [[NSMutableArray alloc]init];

    NSLog(@"<- time finish parser");
    NSLog(@"<- time begin implement arrays");

    for (NSDictionary *myDict in speakersArray) {

        _nextSpeaker = [[TOCSpk alloc]init];
        [_nextSpeaker setName:[myDict objectForKey:@"name"]];
        [_nextSpeaker setBusiness:[myDict objectForKey:@"business"]];
        [_nextSpeaker setDesc:[myDict objectForKey:@"desc"]];
        [_nextSpeaker setTwitter:[NSURL URLWithString:[myDict objectForKey:@"twitter"]]];
        [_nextSpeaker setPicture:[_nextSpeaker retrieveImageFromServer:[myDict objectForKey:@"picture"]]];
        [myArray addObject:_nextSpeaker];
    }

    NSLog(@"<- time finish implement array"); 
}
4

1 回答 1

2

我怀疑缓慢来自调用retrieveImageFromServer,这让我认为您正在访问网络。如果该访问是同步的,从您在同一语句中分配图像这一事实看来,这肯定会很慢。

您应该检查您的代码并使其在单独的线程上运行或使用异步网络访问。

编辑:

在您对使用 发表评论后dataWithContentsOfURL,我的上述假设得到了证实。您可以阅读这篇关于异步下载图像的方法的 SO 帖子,或者您可以使用任何可用的各种网络框架。

可能,最简单的前进路径是使用SDWebImage,这是一个为图像提供异步下载的类,因此您不必为线程管理而烦恼,或者NSURLConnection

只需#import UIImageView+WebCache.h 头,并setImageWithURL:placeholderImage:从方法中调用tableView:cellForRowAtIndexPath: UITableViewDataSource方法。从异步下载到缓存管理,一切都将为您处理。

于 2013-01-10T11:38:51.147 回答