2012-12-15 61 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)區