0

我是 ios 开发的新手。当我在 ios 5 中使用 json 解析器解析图像时,我的应用程序变慢了。请有人帮忙解决这个问题。

-(NSDictionary *)Getdata
{
    NSString  *urlString = [NSString stringWithFormat:@"url link"];
    urlString = [urlString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSURL *url = [NSURL URLWithString:urlString];
    NSData* data = [NSData dataWithContentsOfURL:url];
    NSError* error;
    NSDictionary* json;
    if (data) {
        json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

        NSLog(@"json...%@",json);
    }

    if (error) {
        NSLog(@"error is %@", [error localizedDescription]);

        // Handle Error and return
        //    return;
    }

    return json;
}
4

2 回答 2

0

这条线可能是罪魁祸首。

NSData* data = [NSData dataWithContentsOfURL:url];

如果您在主线程上调用它(并且因为您根本没有提到线程,我怀疑您是这样),它将阻塞所有内容并等待服务器响应。

这对用户来说是一个非常糟糕的体验:)

您需要在后台线程上完成所有这些操作,并在完成后通知主线程。有几种方法可以做到这一点(NSOperation 等),但最简单的就是这样:

// Instead of calling 'GetData', do this instead
[self performSelectorOnBackgroundThread:@selector(GetData) withObject:nil];


// You can't return anything from this because it's going to be run in the background
-(void)GetData {
    ...
    ...

    // Instead of 'return json', you need to pass it back to the main thread
    [self performSelectorOnMainThread:@selector(GotData:) withObject:json waitUntilDone:NO];
}


// This gets run on the main thread with the JSON that's been got and parsed in the background
- (void)GotData:(NSDictionary *)json {
    // I don't know what you were doing with your JSON but you should do it here :)
}
于 2012-11-08T12:33:36.200 回答
0

您对问题的描述并不完全有帮助。我不清楚您的应用程序中的所有内容是否都很慢,或者只是某些操作;如果您经历了一个缓慢的动作,然后它又变快了,或者它继续缓慢地执行。

不管怎样,一般规则是在单独的线程上执行所有网络通信,包括解析答案,即不在负责管理用户界面的主线程上。这样,应用程序保持响应并且看起来很快。

如果您可以单独下载图像,您已经可以显示结果并在图像将出现的位置放置一个占位符。稍后,当您收到图像时,您删除占位符并将图像放在那里。

于 2012-11-08T12:25:28.917 回答