1

사용자가 상태를 업데이트 할 수 있도록 작성하는 iOS 앱을 만들고 사람들이 여러 가지 방식으로 의견을 말할 수 있도록하고 있습니다. 기본적으로 상태 업데이트에는 여러 가지 속성이 있습니다. 그것과 함께 저장 될 것입니다. 이 상태 업데이트가 50 개 이상인 홈 스크린이있는 앱을 테이블보기로 표시한다고 가정 해 보겠습니다.iOS - Amazon S3 느린 다운로드

큰 게임을하기 전에 기술을 습득하려고하는 개발자 인 연습/데모 앱에 눈을 돌리고 초점을 맞춰보세요. 본질적으로 저는 싱가포르에 본사를 둔 S3 버킷을 설치하여 시작했습니다. . 나는 싱가포르에 살고 있기 때문에 근처에 서버가 있으며 모든 것이 빠르고 원활해야합니다. 단지 그것을 제외하고. 그것의 천천히, 그리고 나를 짜증나게하기 시작.

고해상도 파노라마 이미지를 댓글, 좋아요 등으로로드하는 S3을 사용하는 앱을 알고 있으며이 모든 데이터를로드하는 데 약간 더 시간이 걸립니다. 나는 그들이 실제로 프로세스를 수행하는 방법을 잘 모르겠다. 나는 S3에 이미지를 저장한다는 것을 알고 있지만, 내가 아는 것이 전부다. 내 시범 데모에서는 몇 가지 텍스트 (예 : 20)를 업로드 한 다음 다운로드하면 60mbps 무선 랜에서 15 초가 걸립니다. 이 텍스트들은 각 문장을 초과하지 않으며, 문구이기 때문에 나는 혼란 스럽습니다.

CloudFront 설정이 있지만 웹 사이트가 아닙니다. 내가 배포판과 URL을 모든 설정을 관리하지만 내 코드에서 설정하는 방법은 있습니까? 이것은 아마 내 다른 애플 리케이션에서 릴리스에 못 박는 나의 가장 큰 질문이다. 그렇더라도 싱가포르에 거주하며 양동이가 싱가포르 서버에 있으므로 자체 테스트/실습을위한 CloudFront가 필수 사항은 아닙니다.

이 코드는 매우 혼란 스럽습니다. 여기에 제가 작성한 주석이 달린 코드가 있습니다. 어떤 문제입니까, 느린 것으로 오인되고있는 오해입니까?

- (void)loadObjects { 

S3ListObjectsRequest *listObjectRequest = [[S3ListObjectsRequest alloc] initWithName: @"testbucketquotes.rohanprostudios"]; 
S3ListObjectsResponse *listObjectResponse = [[AmazonClientManager s3] listObjects:listObjectRequest]; 
if(listObjectResponse.error != nil) 
{ 
} 
else 
{ 
    S3ListObjectsResult *listObjectsResults = listObjectResponse.listObjectsResult; 

    if (objects == nil) { 
     objects = [[NSMutableArray alloc] initWithCapacity:[listObjectsResults.objectSummaries count]]; 
    } 
    else { 
     [objects removeAllObjects]; 
    } 

    // By defrault, listObjects will only return 1000 keys 
    // This code will fetch all objects in bucket. 
    NSString *lastKey = @""; 
    for (S3ObjectSummary *objectSummary in listObjectsResults.objectSummaries) { 

     if ([[objectSummary key] rangeOfString: @"UploadedQuote"].location != NSNotFound) { 

     [objects addObject:[objectSummary key]]; 
     lastKey = [objectSummary key]; 

     } 
    } 

    while (listObjectsResults.isTruncated) { 
     listObjectRequest = [[S3ListObjectsRequest alloc] initWithName: @"testbucketquotes.rohanprostudios"]; 
     listObjectRequest.marker = lastKey; 

     listObjectResponse = [[AmazonClientManager s3] listObjects:listObjectRequest]; 
     if(listObjectResponse.error != nil) 
     {     
      break; 
     } 

     listObjectsResults = listObjectResponse.listObjectsResult; 

     for (S3ObjectSummary *objectSummary in listObjectsResults.objectSummaries) { 

      if ([[objectSummary key] rangeOfString: @"UploadedQuote"].location != NSNotFound) { 

       [objects addObject:[objectSummary key]]; 

      } 

      lastKey = [objectSummary key]; 
     } 
    } 

    if (objects.count) { 

     for (int i = 0; i <= objects.count - 1; i++) { 

      S3GetObjectRequest *req = [[S3GetObjectRequest alloc] initWithKey:[objects objectAtIndex: i] withBucket: @"testbucketquotes.rohanprostudios"]; 

      `// asynchronously loads text (adds to operation queue)` 
      AsyncQuoteDownloader *quote = [[AsyncQuoteDownloader alloc] initWithRequest:req andViewController: self]; 

      [operationQueue addOperation: quote]; 
      // in 'AsyncQuoteDownloader' when finished calls a method in this view controller adding the response to an array and reloading a table 
     } 

    } 
    } 

}); 
} 

내 코드가 너무 오래 지연되는 것은 무엇입니까? 이미징 서비스가 좋아요 및 댓글 등으로 HQ 이미지를로드하는 데 1 초가 걸리는 경우 1 ~ 2 초가 걸리므로이 작업은 밀리 초가 걸릴 것이라고 생각했을 것입니다.

업데이트 확인


... 어떤 도움을 주셔서 감사합니다, 그래서 키의 반복은 여기 문제가 아니라 객체의 다운로드 될 것 같지 않습니다. 이견있는 사람? 감사합니다 ...

답변

1

처음으로 Objective C를 본 적이 처음이므로이 부분이 완전히 잘못되었을 수 있습니다. 하지만 ... 당신이 전체 양동이의 열쇠를 반복하고있는 것처럼 보입니다. 이는 상당한 양의 키가 있으면 정말 느려질 것입니다.

더 나은 디자인은 이미 AWS를 사용하고 있으므로 DynamoDB와 같은 항목에 조회 테이블을 저장하는 것입니다. 거기에서 쿼리하고 일치하는 ID (S3 키) 배열을 가져온 다음 S3에서 일치 개체를 가져옵니다.

+0

DynamoDB의 무엇에 AmazonS3Client의 엔드 포인트를 설정하는 데 필요한

잘 작동? 내가 들었던 것을 들었지만, 나는 그것을 조사 할 것이다. 그러나 일치하는 ID의 배열을 가져 와서 일치를 가져 오는 것이 무엇을 의미 하는가? 이 용어에 대해 혼란 스러울뿐입니다 ... – MCKapur

+0

안녕하세요, 제 질문에 대한 답변을 – MCKapur

+0

으로 업데이트했습니다. DynamoDB는 Amazon의 SSD 지원 스토리지에서 실행되는 키 저장소의 버전입니다 (매우 빠른 NoSQL 데이터베이스). 위의 코드 스 니펫은 테이블을 나열하는 것입니다. 데이터를 추가 할 때까지는 분명히 비어있게됩니다. AWS 문서를 읽는 데 시간을 할애하는 것이 좋습니다. 그것들은 매우 잘 작성되어 있으며 SO 포스터보다 더 심층적 인 도움을 제공 할 수 있습니다. – jamieb

1

내 자신의 iOS 앱에서 사용한 다른 옵션은 응용 프로그램 계층으로 Heroku를 사용하고 콘텐츠를 가리키는 POSTGRESQL 레코드를 만드는 것입니다. 이렇게하면 레일즈에서 풍부한 쿼리를 생성하고 DynamoDB와 S3 모두를 지불하는 대신 Rails의 힘으로 업로드 및 다운로드를 중재 할 수 있습니다.

+0

감사합니다. 그러나 나는 당신이 말하는 것에 대해 전혀 단서가 없습니다! 미안 ... 헤로 쿠는 뭐니? POSTGRESQL이란 무엇이고 Rails는 무엇입니까? 나는 정말 내 S3 쉘에 있기 때문에 나는이 용어/서비스에 대해 정말로 외국인이다. 저를 시작하고 이해시키기 위해 어떤 자원/예를 들어 주시겠습니까? 감사합니다 – MCKapur

+0

나는 이것이 모든 것을 설명 할 것이라고 생각합니다 : https : //devcenter.heroku.com/articles/ios-core-data-buildpack-app –

+0

아마존은 SES 이메일 서비스를 가지고 있기 때문에 감사합니다. SNS 알림 서비스를 제공하므로 모든 것이 매우 통일 된 것처럼 보입니다. 이 병을 확인하고 다시 연락하십시오. – MCKapur

0

내 버킷이 싱가포르 지역이 아닌 미국 지역으로 설정되었습니다 ...빨리 지금

그것을 #doh, 그 난 그냥 싱가포르 (SEA) 지역