1

NSURLSessionUploadTask の実装に成功し、バックグラウンドとフォアグラウンドの両方で動作します。しかし、応答データを読み取るときに問題があります。

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{

    NSLog(@"1 DATA:\n%@\nEND DATA\n", [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]);

    [self.responseData appendData:data];
}

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    if (!error) {                        
        NSLog(@"AT THE END DATA:\n%@\nEND DATA\n", [[NSString alloc] initWithData: self.responseData encoding: NSUTF8StringEncoding]);

            [self parsingJSONResponse:self.responseData];

    } else {
        NSLog(@"HTTP uploading error : %@", error);
    }
}

これらは、上記の 2 つの NSLog の出力です

1 データ: {"success":true,"data":[{"uuid":"8BE7DF37-9DA1-44D2-B48C-D012F699A9B1","id":266626},{"uuid":"3406D865-1A41-4FC6 -BA0B-0638F17757CC","id":266656}],"エラー":[],"entityName":"LeadProfile"} END DATA

最後のデータ: {"success":true,"data":[{"uuid":"8BE7DF37-9DA1-44D2-B48C-D012F699A9B1","id":266626},{"uuid":"3406D865-1A41 -4FC6-BA0B-0638F17757CC","id":266656}],"エラー":[],"entityName":"LeadProfile"}{"成功":true,"データ":[{"uuid":"8BE7DF37 -9DA1-44D2-B48C-D012F699A9B1","id":266626},{"uuid":"3406D865-1A41-4FC6-BA0B-0638F17757CC","id":266656}],"エラー":[]," entityName":"LeadProfile"} END DATA

1 つのアップロード タスクに対して 2 つの異なる応答が返されるのはなぜでしょうか。場所ごとにどのようself.responseDataに異なるのでしょうか?

これは、Apple Web サイトに記載されている理由によるものだと思う人はいますか? (NSData オブジェクトは多くの場合、多数の異なるデータ オブジェクトから結合されるため、可能な場合は常に、bytes メソッド (NSData オブジェクトを 1 つのメモリ ブロックにフラット化する) を使用するのではなく、NSData の enumerateByteRangesUsingBlock: メソッドを使用してデータを反復処理します。 apple.com

4

4 に答える 4

2

あなたが尋ねる:

1 つのアップロード タスクに対して 2 つの異なる応答が返されるのはなぜでしょうか。場所ごとにどのようself.responseDataに異なるのでしょうか?

responseData適切に、または適切なタイミングでインスタンス化されなかったことが原因であることは間違いありません。(私は で行う傾向がありますdidReceiveResponse。) 注意しresponseDataてくださいdidReceiveData。あなたが見てdataいる. inresponseDataを追加した直後にチェックすることをお勧めします。問題は、なぜ正しくインスタンス化/初期化されないのかということです。datadidReceiveData

これは、Apple Web サイトに記載されている理由によるものだと思う人はいますか?

NSDataオブジェクトは多くの場合、多数の異なるデータ オブジェクトからまとめられているため、可能であれば、 bytes メソッド (オブジェクトを 1 つのメモリ ブロックにフラット化する) を使用するのではなく、NSDataのメソッドを使用してデータを反復処理します。」enumerateByteRangesUsingBlock:NSData

いいえ、これはまったく関係のない問題です。ここでの問題は、はるかにありふれたものだと確信しています。

残念ながら、正確な問題を診断するための十分なコードがここにはありません。

于 2014-08-02T03:39:33.847 に答える
1

あなたが受け取るデータは部分的にしかありません。デリゲート メソッドは、配信された各データ オブジェクトのコンテンツを連結して、NSMutableData オブジェクトを使用して URL ロード用の完全なデータを構築する必要があります。

于 2014-07-17T16:50:19.350 に答える
1

ドキュメントにあるように、受信したデータは不連続である可能性があります。

したがって、可能な実装は次のとおりです。

- (void)URLSession:(NSURLSession *)session
          dataTask:(NSURLSessionDataTask *)dataTask
    didReceiveData:(NSData *)data
{
    if (!self.responseData)
    {
        NSUInteger capacity = 0;
        if (dataTask.response.expectedContentLength != NSURLResponseUnknownLength)
        {
            capacity = (NSUInteger)dataTask.response.expectedContentLength;
        }

        self.responseData = [[NSMutableData alloc] initWithCapacity:capacity];
    }

    [data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
        [self.responseData appendBytes:bytes length:byteRange.length];
    }];
}

ただし、の実装- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)errorは正しいです。

于 2015-06-29T08:48:21.553 に答える