0

UITableViewで複数のダウンロードの進行状況を処理するためのクラスを書きたいと提案した人もいるので、これが私の実際の問題ですこのためのクラスを作成する方法がわかりません。誰かがヒントやアイデアを手伝ってくれますか?

4

2 に答える 2

0

確認するグループはNSURLRequestとNSURLConnectionです。前者はリクエスト(URL、httpメソッド、パラメータなど)を指定し、後者はそれを実行します。

ステータスを更新したいので(他の質問でこのスケッチに答えたと思います)、接続から到着したデータのチャンクを渡すNSURLConnectionDelegateプロトコルを実装する必要があります。予想されるデータの量がわかっている場合は、前に提案したように、受け取った量を使用してdownloadProgressフロートを計算できます。

float downloadProgress = [responseData length] / bytesExpected;

SOの見栄えの良いサンプルコードを次に示します。このように複数の接続に拡張できます...

MyLoader.m

@interface MyLoader ()
@property (strong, nonatomic) NSMutableDictionary *connections;
@end

@implementation MyLoader
@synthesize connections=_connections;  // add a lazy initializer for this, not shown

// make it a singleton
+ (MyLoader *)sharedInstance {

    @synchronized(self) {
        if (!_sharedInstance) {
            _sharedInstance = [[MyLoader alloc] init];
        }
    }
    return _sharedInstance;
}

// you can add a friendlier one that builds the request given a URL, etc.
- (void)startConnectionWithRequest:(NSURLRequest *)request {

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    NSMutableData *responseData = [[NSMutableData alloc] init];
    [self.connections setObject:responseData forKey:connection];
}

// now all the delegate methods can be of this form.  just like the typical, except they begin with a lookup of the connection and it's associated state
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

    NSMutableData *responseData = [self.connections objectForKey:connection];
    [responseData appendData:data];

    // to help you with the UI question you asked earlier, this is where
    // you can announce that download progress is being made
    NSNumber *bytesSoFar = [NSNumber numberWithInt:[responseData length]];
    NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:
        [connection URL], @"url", bytesSoFar, @"bytesSoFar", nil];

    [[NSNotificationCenter defaultCenter] postNotificationName:@"MyDownloaderDidRecieveData"
        object:self userInfo:userInfo];

    // the url should let you match this connection to the database object in
    // your view controller.  if not, you could pass that db object in when you
    // start the connection, hang onto it (in the connections dictionary) and
    // provide it in userInfo when you post progress
}
于 2012-06-18T03:26:20.797 に答える
0

私はまさにそれを行うためにこのライブラリを書きました。github リポジトリで実装をチェックアウトできます。

于 2016-12-16T18:09:40.603 に答える