2012-03-23 3 views
0

현재 내 앱의 didFinishLaunchingWithOptions에있는 파일을 검색하여 응용 프로그램 디렉토리에 저장하는 기능을 사용하고 있습니다.원격 파일을 검색 할 때 연결 속도가 느려 앱 충돌이 발생하지 않도록하십시오.

약한 연결이있을 때 앱이 중단 될 때 앱이 중단되는 것으로 나타났습니다. 나는 앱이 깨지기 전에 애플이 허락하는 20 초의 시간 제한이 있음을 읽었다. 이 올바른지? 그렇다면 매우 약한 연결을 제외하고는 앱이 완벽하게 작동하므로 이것이 내 문제의 원인이라고 생각합니다.

어떻게하면 내 논리를 수정하여이를 보완 할 수 있습니까?

- (void)writeJsonToFile 
{ 
//applications Documents dirctory path 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

//live json data url 
NSString *stringURL = @"http://link-to-my-data.json"; 
NSURL *url = [NSURL URLWithString:stringURL]; 
NSData *urlData = [NSData dataWithContentsOfURL:url]; 

//attempt to download live data 
if (urlData) 
{ 
    NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"data.json"]; 
    [urlData writeToFile:filePath atomically:YES]; 
} 
//copy data from initial package into the applications Documents folder 
else 
{ 
    //file to write to 
    NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"data.json"]; 

    //file to copy from 
    NSString *json = [ [NSBundle mainBundle] pathForResource:@"data" ofType:@"json" inDirectory:@"html/data" ]; 
    NSData *jsonData = [NSData dataWithContentsOfFile:json options:kNilOptions error:nil]; 

    //write file to device 
    [jsonData writeToFile:filePath atomically:YES]; 
} 

은}

답변

5

는 주 스레드에서 이런 종류의 물건을 실행하는 아주 나쁜 생각 : 나는 당신이 가정 - 당신의 네트워크 동작을 기다리는 동안 기본적으로, 당신은 전체 UI를 차단합니다 완전한.

dataWithContentsOfURL은 이런 종류의 경우에는 좋지 않습니다. NSURLConnection 또는 AFNetworking과 같은 랩퍼 라이브러리 중 하나를 사용하는 것이 더 좋을 것입니다. 연결 시간이 정상적으로 종료 될 때와 같은 경우를 처리 할 수 ​​있기 때문입니다.

이러한 라이브러리에는 기본 UI 스레드가 잠기는 것을 방지하는 데이터를 비동기 적으로 다운로드하는 기본 제공 메서드가 있습니다.

+0

내 스레드에서 결함을 지적 해 주셔서 감사합니다. 이것은 첫 번째 응용 프로그램이므로 스레딩 및 메모리 관리의 개념을 여전히 조정하고 있습니다. 이 메서드의 현재 구현을 다시 생각한 후에는 앱이 시작된 후에 백그라운드에서 데이터를 업데이트하려고합니다. 귀하의 대답은 @SVGreg와 유사하지만 제안이 먼저 제시되었으므로 여기에 답이 주어집니다. –

1

다운로드 한 데이터는 언제 필요합니까?

답변에 따라 스레드 내의 메소드를 호출 할 수 있습니다. 이렇게하면 주 스레드가 차단되지 않습니다.

처음부터 데이터가 필요한 경우에도 로더를 만들고 백그라운드에서 파일을 다운로드 한 다음 파일을 다운로드 한 후 앱을 활성화 할 수 있습니다.

+0

내 앱을 실행하려면 데이터가 있어야합니다. 번들에있는 데이터 파일의 로컬 사본으로 앱을 발송하고 있으므로 처음 실행시 로컬 데이터를 사용하고 백그라운드에서 모든 업데이트를 검색합니다. 신선한 데이터를 기다리는 동안 앱을 비활성 상태로 두지 않아도되므로이 방법이 가장 좋은 방법 인 것 같습니다. –

+0

이것은 좋은 해결책으로 들립니다. 그러나 lxt와 SVGreg가 쓴 것처럼 파일을 다운로드하는 가장 좋은 방법은 무엇인지 다시 생각해보십시오.또 다른 해결책은 ASIHTTPRequest를 사용하는 것입니다. 그러나 이것은 매우 큰 크기가 아닐 것이라고 생각되는 하나의 파일을 다운로드하기에는 너무 압도적입니다. – o15a3d4l11s2

1

NSData *urlData = [NSData dataWithContentsOfURL:url];의 내부 구현에서 더 독립적이라고 생각하면 NSURLConnection을 기반으로하는 자체 다운로드 클래스를 구현해야합니다.

링크는 읽기 :

URL Loading System Programming Guide

NSURLConnection Class Reference

NSURLConnectionDelegate Protocol Reference

그래서 당신은 당신의 코드에 의해 모든 연결 오류를 포착하고이 경우 올바른 동작을 구현할 수 있습니다.

+0

+1은 제안 및 지원 링크입니다. 이것이 내가 진행하고 싶은 길인지를 평가하고 결정할 것입니다. –

관련 문제