11

iOS 6.1 の iPhone 5 で 5 MB のファイルをダウンロードするのに 2 分以上かかるという問題に直面しています。

同じ iOS バージョンの iPhone 4S を使用すると、わずか 10 秒しかかかりません。どちらも WiFi を使用しています。

別のキャッシュ ポリシーと NSURLRequest のタイムアウト間隔を試しましたが、何も変わりませんでした。まだ時間がかかっています。ダウンロードは HTTP 経由です。

私はNSURLConnectionクラスを使用しています。この「大きな」ファイルをダウンロードする前に、他に 2 つのファイルをダウンロードしています。

時間を短縮するために、他に何が重要なのかわかりません。

前もって感謝します。

コード:

@interface MyClass : NSObject <NSURLConnectionDelegate>
{
  @private id delegate;
  NSURLConnection *connection;
  NSMutableData* responseData;
  //...
}


#import "MyClass.h"

@implementation MyClass

-(void)getObj1:(id)delegateObj
{
   delegate = delegateObj;

   NSString *url = @"...";

   NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:120.0];

   connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

   if(connection)
   {
      responseData = [NSMutableData data];
   }
}

-(void)getObj2:(*String)somesString
{

   NSString *url = @"...";

   NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:120.0];

   connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

   if(connection)
   {
    responseData = [NSMutableData data];
   }
}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{ 
    //....
}


-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
   [responseData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
   if(firstRequest)
   {
      //save data from first request and set responseData clear
      [self getObj2:@"..."];
   }
}

その他は特に何もなければ、これで十分だと思います

この投稿https://devforums.apple.com/message/754875#754875を見つけましたが、それでもうまくいきません。しかし今、私はこの奇妙な状況をよりよく理解しています。

4

8 に答える 8

1

AFDownloadRequestOperation (AFNetworking "sublass") を使用します。一時停止/再開操作も可能です。

ここに例があります https://stackoverflow.com/a/12209618

于 2013-03-24T04:50:28.227 に答える
0

gzipを使用してリモート ファイルを圧縮してみてくださいNSURLRequest。これにより、接続が劇的に高速化されます。

これを使用するには、サーバーにインストールする必要があります。幸いなことに、サーバーで使用apache2している場合は、デフォルトで付属しています。サーバー/URL のgzip圧縮が有効になっていることをテストするには、次のオンライン ツールでテストします: http://www.feedthebot.com/tools/gzip/

答えが「はい」の場合は、Xcode で目的の C コードにコードを追加します。コードの次の行の後:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:120.0];

これを追加するだけです:

// Create a mutable copy of the immutable request and add more headers
NSMutableURLRequest *mutableRequest = [request mutableCopy];

//add gzip compression
[mutableRequest addValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];

// Now set our request variable with an (immutable) copy of the altered request
request = [mutableRequest copy];

AFNetworkingこれにより、応答時間が大幅に短縮され、小さなタスクNSURLRequestやタスクに使用する必要がなくなりNSURLConnectionます.

于 2015-02-12T20:53:41.877 に答える
0

試しましたAFNetworkingか?のラッパーNSURLConnectionです。ダウンロードを高速化するのに役立つかどうかはわかりませんが、NSURLConnection.

于 2013-03-23T18:48:08.570 に答える
0

GCD dispatch_async キューを使用して一連の NSURLRequest リクエストを実行し、サーバーからデータをダウンロードしたり、サーバーの応答を取得したりしました。

NSString *webURL = @"http://therealurl.appspot.com/?format=json&url=bit.ly/a";
NSURL *url = [NSURL URLWithString:webURL];
NSURLRequest *awesomeRequest = [NSURLRequest requestWithURL:url];
NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:awesomeRequest delegate:self];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
    NSRunLoop *loop=[NSRunLoop currentRunLoop];
    [connection scheduleInRunLoop:loop forMode:NSRunLoopCommonModes];
    //[self processTheAwesomeness];
});
于 2013-06-04T10:29:12.467 に答える
0

私の経験では、 AFNetworkingはダウンロードの処理において素晴らしい仕事をします。私は 10 MB 以上のサイズのファイルに対してダウンロード操作を使用しています。したがって、使用することを強くお勧めします。

プログレスバーを表示するためのスタックに関する私の回答AFNetworking。両方の方法を 実装する回答NSUrlconnectionを参照してください。ダウンロード時間がどのように変化するかを分析します。それを試してみてください

于 2013-06-10T09:27:18.053 に答える
-1

お使いの端末の問題だと思います。友人からの別のデバイスを試してください。

于 2013-06-07T06:03:50.503 に答える