2012-12-15 66 views
1

我正在创建一个iOS应用程序,允许用户写出让状态更新说明,人们可以对其进行评论,就像它一样,以多种方式与它进行交互,基本上状态更新具有多个属性将与它一起存储。想象一下,一个应用程序的主屏幕将超过50个这些状态更新表示为表格视图。iOS - Amazon S3 Slow Download

现在把目光转移到专注于练习/演示应用程序,一个试图在大型游戏开始前掌握技术的开发者(这就是我!)所以基本上,我已经开始在新加坡建立一个S3存储桶。我住在新加坡,所以附近有一台服务器,确实一切都应该快速而顺畅。除此之外,它不是。它缓慢,并开始让我很烦恼。

我知道一个应用程序,使用S3加载高清晰度全景图像与评论,喜欢等,它需要一秒或更多的所有这些数据加载。我不知道他们是如何实际执行这个过程的,我知道他们将这些图像存储在S3上,但我知道的就是这些。在我的初学者演示中,我只需上传一些文本(比如说20)然后下载它们,而我的60 mbps WiFi下需要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 
     } 

    } 
    } 

}); 
} 

我的代码有什么问题,使它滞后很多?如果成像服务需要1秒钟才能加载HQ图像,并且喜欢和评论等需要1-2秒,那么我认为这将花费毫秒时间。

感谢您的帮助......

更新


好了,所以按键的重复,似乎并没有成为这里的问题,而是对象的下载。有什么想法吗?谢谢...

回答

1

这是我第一次见过Objective C,所以我可能在这里完全错了。但是......看起来你正在遍历整个桶的关键点。这将是真的,真的很慢,任何可观数量的钥匙。

更好的设计将存储查找表像DynamoDB(因为您已经使用AWS)。你可以在那里查询,获得一个匹配的ID(S3键)数组,然后从S3中获取匹配对象。

+0

什么是DynamoDB?我没有听说过的东西,我会检查出来,但是通过获得一组匹配的id并获取匹配,这意味着什么。 – MCKapur

+0

嗨,我已经更新了我的问题,我想你可能会谈论 – MCKapur

+0

DynamoDB是在SSD支持的存储上运行的亚马逊版本的键值存储(它是一个速度非常快的NoSQL数据库)。上面的代码片段只是列出了表格 - 在添加数据之前它显然是空的。我建议你花一些时间阅读AWS文档。它们写得非常好,并且能够为您提供比SO海报更深入的帮助。 – jamieb

1

另一种选择,就像我在我自己的iOS应用程序中使用的那样,将Heroku用作应用程序层并创建指向您的内容的POSTGRESQL记录。通过这种方式,您可以在Rails中创建丰富的查询,并利用Rails的强大功能进行上传和下载,而不用为DynamoDB和S3付费。

+0

谢谢,但是我完全不知道你在说什么!对不起......什么是Heroku?什么是POSTGRESQL,什么是Rails?我非常喜欢S3 shell,所以我真的是这些条款/服务的外国人。你能否指点我的任何资源/例子让我开始理解?谢谢 – MCKapur

+0

我认为这将解释一切:https://devcenter.heroku.com/articles/ios-core-data-buildpack-app –

+0

谢谢我检查出来,我宁愿使用S3和DynamoDB,但因为亚马逊有SES电子邮件服务和SNS通知服务,所以整个事情看起来非常统一。不好意思检查一下,然后回复你 – MCKapur

0

原来我的桶被设置为美国地区,而不是新加坡地区...#doh

它的速度更快,现在,它的做工精细

我只需要在AmazonS3Client的端点设置为新加坡(SEA)区