1

私はiOSアプリを作成しています。これにより、ユーザーはステータスの更新を記述でき、ユーザーはそれにコメントしたり、さまざまな方法で操作したりできます。基本的に、ステータスの更新には複数のプロパティが保存されます。これらのステータス更新が50を超えるホーム画面がテーブルビューに表示されているアプリを想像してみてください。

今度は目を離して、ビッグゲームの前にテクニックを習得しようとしている開発者である練習/デモアプリに焦点を合わせます(それは私です!)したがって、基本的に、私はシンガポールに拠点を置くS3バケットをセットアップすることから始めました。私はシンガポールに住んでいるので、近くにサーバーがあり、本当にすべてが高速でスムーズでなければなりません。ただし、そうではありません。その遅い、そしてそれは私をイライラさせ始めています。

コメントやいいねなどを含む高解像度のパノラマ画像を読み込むS3を使用するアプリを知っていますが、このすべてのデータが読み込まれるまでに1秒以上かかります。彼らが実際にプロセスをどのように実行するかはわかりません。彼らがS3に画像を保存していることは知っていますが、私が知っているのはそれだけです。スターターデモでは、テキストの一部(たとえば、20)をアップロードしてからダウンロードするだけで、60mbpsのwifiで15秒ほどかかります。これらのテキストはそれぞれ1文を超えることはなく、フレーズであるため、ここでは本当に混乱しています。

CloudFrontをセットアップしましたが、Webサイト用ではありませんか?ディストリビューションの管理と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秒かかります。

助けてくれてありがとう...

アップデート


さて、ここではキーの反復は問題ではないようですが、オブジェクトのダウンロードは問題ではありません。何かご意見は?ありがとう...

4

3 に答える 3

1

Objective Cを見たのはこれが初めてなので、ここでは完全に間違っている可能性があります。しかし...バケット全体のキーを繰り返し処理しているように見えます。これは、かなりの量のキーがあると、本当に、本当に遅くなります。

より良い設計は、ルックアップテーブルをDynamoDBのようなものに保存することです(すでにAWSを使用しているため)。そこでクエリを実行し、一致するID(S3キー)の配列を取得してから、S3から一致オブジェクトをフェッチします。

于 2012-12-15T17:43:45.383 に答える
1

私が自分のiOSアプリで使用した別のオプションは、Herokuをアプリレイヤーとして使用し、コンテンツを指すPOSTGRESQLレコードを作成することです。このようにして、DynamoDBとS3の両方にお金を払うのではなく、Railsでリッチクエリを作成し、Railsの機能を使用してアップロードとダウンロードを仲介できます。

于 2012-12-15T17:48:54.537 に答える
0

私のバケットはシンガポール地域ではなく米国地域に設定されていたことがわかりました...#doh

今では速く、正常に動作しています

AmazonS3Clientのエンドポイントをシンガポール(SEA)リージョンに設定する必要がありました

于 2012-12-17T01:09:06.710 に答える