3

私は定期的に新しいレベルをデバイスに「プッシュ」する必要がある iOS アプリに取り組んでいます。レベルは、画像、javascript、および css ファイルを含む HTML5 ページです。ユーザーがレベルを再生する前に、すべてのレベルのファイルをローカルにキャッシュする必要があります。各レベルは約 1.5MB です。HTML、画像、css、および js を含むレベルのフォルダー全体を 1 つの zip アーカイブにアーカイブし、この zip をダウンロードしてからデバイスでアーカイブ解除することを考えています。しかし、ファイルは同時にダウンロードできるため、各ファイルを個別にダウンロードする方が効率的ではないでしょうか?

これは私の最初の iOS アプリであり、正しく行う方法がよくわかりません。問題は、サーバーからフォルダー全体を非同期にダウンロードし、すべてのファイルがダウンロードされたときにコールバックをトリガーする最良の方法は何ですか (ユーザーがアプリを閉じたり、ダウンロードの途中で接続を失ったりする可能性があることに注意してください)。

4

2 に答える 2

1

ほとんどのユーザーは実際には低速の3G接続を使用しているため、圧縮されたアーカイブのダウンロードははるかに高速になり(そしてユーザーにとっては安価になり)、おそらく接続が完全に飽和状態になります。同時に実行すると、同じ制限された接続を共有する必要があるため、すべての転送が遅くなります。一度にそれを行うことはまた、例えばファイル転送が失敗する多くの転送の1つに関連する頭痛を回避します。

于 2012-04-21T15:35:24.360 に答える
0

デバイスがダウンロードするのと同じくらい圧縮を解除するのに時間がかかるため、圧縮は実際には遅くなることがわかりました。前述のように、これを使用して ASIHTTPRequest を調べると、「ページとそのすべてのリソースを取得する」と言うことができます http://allseeing-i.com/ASIHTTPRequest/Setup-instructions

- (IBAction)downloadLevel:(NSURL *)levelURL
{
    // Assume request is a property of our controller
    // First, we'll cancel any in-progress page load
    [self.request setDelegate:nil];
    [self.request cancel];

    [self setRequest:[ASIWebPageRequest requestWithURL:levelURL]];
    [self.request setCompletionBlock:^{
        //code in here runs when the request finishes
    }];

    [self.request setFailedBlock:^{
        //code in here runs when the request fails
    }];

    // Tell the request to embed external resources directly in the page
    [self.request setUrlReplacementMode:ASIReplaceExternalResourcesWithData];

    // It is strongly recommended you use a download cache with ASIWebPageRequest
    // When using a cache, external resources are automatically stored in the cache
    // and can be pulled from the cache on subsequent page loads
    [self.request setDownloadCache:[ASIDownloadCache sharedCache]];

    // Ask the download cache for a place to store the cached data
    // This is the most efficient way for an ASIWebPageRequest to store a web page
    [self.request setDownloadDestinationPath:
     [[ASIDownloadCache sharedCache] pathToStoreCachedResponseDataForRequest:self.request]];

    [self.request startAsynchronous];
}

詳細なドキュメントは、http ://allseeing-i.com/ASIHTTPRequest/ASIWebPageRequest と
http://allseeing-i.com/ASIHTTPRequest/How-to-use
に あり ます。すべて非常に読みやすいです。

于 2012-04-21T16:30:59.403 に答える