2013-01-10 2 views
0

이것이 내 문제입니다. 제 서버에서 일부 JSON 퇴각으로 iOS를 구축하고 있습니다. 여기에 문제가 없습니다. 모두 정상적으로 작동합니다.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"); 
} 
+0

코드에 오류가있는 것 같습니다. 루프가 다음과 같아야합니다 : for (NSDictionary * myDict in speakersArray)? –

+0

편집했지만, 여기는 pb가 아닙니다. 좀 더 명확하게 코드를 편집했습니다. –

답변

2

나는 속도 저하가 나 네트워크에 액세스하는 것을 생각 할 수있는 retrieveImageFromServer 전화에서 오는 것으로 의심이다. 해당 액세스가 동기이면, 동일한 명령.에서이 L지를 지정한다는 사실에서 보듯이 이것은 Y 인드됩니다.

코드를 검토하여 별도의 스레드에서 실행하거나 비동기 네트워크 액세스를 사용해야합니다.

편집 :

, dataWithContentsOfURL를 사용하는 방법에 대한 귀하의 코멘트 후, 내 위의 가설이 확인된다. 비동기 적으로 이미지를 다운로드하는 방법에 대해 this S.O. post을 읽거나 다양한 네트워킹 프레임 워크를 사용할 수 있습니다. 아마도

, 당신은 스레드 관리 또는 NSURLConnection 자신을 귀찮게 할 필요하지는 있도록 이미지를 비동기 다운로드를 제공하는 클래스이며, 앞으로 SDWebImage를 사용하는 가장 쉬운 경로 :

그냥 # import를 UIImageView + WebCache.h 헤더를 호출하고 tableView:cellForRowAtIndexPath:UITableViewDataSource 메서드에서 setImageWithURL:placeholderImage: 메서드를 호출하십시오. 비동기 다운로드부터 캐싱 관리에 이르기까지 모든 것이 처리됩니다.

+0

사실이 메소드는 서버를 전혀 호출하지 않습니다. JSON 파일 –

+0

에서 파싱 된 URL 문자열에서 UIImage를 인스턴스화합니다. 이미지 데이터의 출처는 무엇입니까? 이미 다운로드 받았습니까? 앱에 번들로 제공됩니까? – sergio

+0

"pictureURL"이라는 http : //myjsonfile.json에 JSON 특성이 있습니다. "http://myurl.com/img.png"다음에 메서드는 (UIImage *)와 같습니다. myMethodname : (NSString *) picturePath { UIImage * myimage [UIImage imageWithData : [NSData dataWithContentsOfURL : [NSURL URLWithString : picturePath]]]; return myImage; } –