Frage

Ich brauche die Größe der Datei wissen, ich (in Bytes) herunterlade in meine App NSURLConnection (GET). Hier ist mein Bytes Code unten empfangen, wenn es hilft. Was muß ich weiß, ist, wie die Größe der Datei in Bytes zu bekommen, so dass ich es verwenden, um eine UIProgressView zu zeigen.

- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)data
// A delegate method called by the NSURLConnection as data arrives.  We just 
// write the data to the file.
{
#pragma unused(theConnection)
    NSInteger       dataLength;
    const uint8_t * dataBytes;
    NSInteger       bytesWritten;
    NSInteger       bytesWrittenSoFar;

    assert(theConnection == self.connection);

    dataLength = [data length];
    dataBytes  = [data bytes];

    bytesWrittenSoFar = 0;
    do {
        bytesWritten = [self.fileStream write:&dataBytes[bytesWrittenSoFar] maxLength:dataLength - bytesWrittenSoFar];
        assert(bytesWritten != 0);
        if (bytesWritten == -1) {
            [self _stopReceiveWithStatus:@"File write error"];
            break;
        } else {
            bytesWrittenSoFar += bytesWritten;

    } while (bytesWrittenSoFar != dataLength);
}
War es hilfreich?

Lösung

[Datenlänge] zurückgibt, die Größe der Daten in Bytes, die Sie die Figur geben sollten Sie suchen.

Aber NSData bietet -writeToFile: atomar: und -writeToFile: Optionen: error Methoden zum Schreiben von Daten auf der Festplatte, so weiß ich nicht, warum Sie Ihre eigene Datei schreiben I / O

.

Andere Tipps

Ich glaube, dass der Code aus dem Beispielcode von Apple SimpleURLConnections ist. Hier ist ein direktes Zitat aus Apples NSURLConnection Methode „Verbindung: didReceiveData:“

  

"Der Delegierte sollte die verketten   Inhalt jedes Datenobjekt zuge   die vollständigen Daten für eine aufzubauen   URL Last. "

NSData keine Verfahren bieten schrittweise in eine Datei zu schreiben, ist es alles auf einmal schreibt, so dass ich denke, dass dieses Verfahren schrittweise zu einem NSOutputStream schreiben, hier genannt filestream, korrekt ist. dataLength in diesem Code wird nur die Länge der Daten zurück, die von der NSURLConnection an die Delegaten in einem einzigen Aufruf gesendet wurde „Verbindung: didReceiveData:“, die insgesamt nicht Länge für die gesamte Verbindung der Daten. Um dies zu erreichen Ich habe hinzugefügt zusätzliche Eigenschaften:

@property (nonatomic, assign)   long long dataWrittenForWholeConnection;
@property (nonatomic, assign)   long long dataLengthOfWholeConnection;

Im Zusammenhang: didReceiveResponse: habe ich die NSURLResponse Methode expectedContentLength die korrekte Schätzung der Empfangsdaten der Dateigröße für die gesamte Verbindung zu erhalten

.
self.dataWrittenForWholeConnection = 0;
self.dataLengthOfWholeConnection = [httpResponse expectedContentLength];

Im Zusammenhang: didReceiveData: Ich habe die folgenden:

// bytes written for current "connection:didReceiveData:" call
bytesWrittenSoFar += bytesWritten;
// cumulative data written for connection so far
self.dataWrittenForWholeConnection += bytesWritten;

// also update the progress bar
if (self.dataLengthOfWholeConnection != NSURLResponseUnknownLength) {
    self.progressView.progress =
        ((float)self.dataWrittenForWholeConnection / (float)self.dataLengthOfWholeConnection);
}

Mit dem Ende der Verbindung, sollte dies wahr sein:

assert(dataWrittenForWholeConnection == dataLengthOfWholeConnection);
Hier

ist der Ausdruck aus dem gleichen SimpleURLConnections Code mit meinen Änderungen zu zeigen, was wirklich geschieht:

connection:didReceiveResponse:
Full size of data is 8789 bytes

connection:didReceiveData:
Data has 1408 bytes
Progress bar is at: 0.160200
1408 bytes of data were written, 1408 bytes so far

connection:didReceiveData:
Data has 1408 bytes
Progress bar is at: 0.320401
1408 bytes of data were written, 2816 bytes so far

connection:didReceiveData:
Data has 1408 bytes
Progress bar is at: 0.480601
1408 bytes of data were written, 4224 bytes so far

connection:didReceiveData:
Data has 1408 bytes
Progress bar is at: 0.640801
1408 bytes of data were written, 5632 bytes so far

connection:didReceiveData:
Data has 1408 bytes
Progress bar is at: 0.801001
1408 bytes of data were written, 7040 bytes so far

connection:didReceiveData:
Data has 1749 bytes
Progress bar is at: 1.000000
1749 bytes of data were written, 8789 bytes so far

connectionDidFinishLoading:
Connection Finished. 8789/8789 bytes of data were written.

Auch die NSOutputStream Methode „write: maxLength:“ Erträge „die Anzahl der tatsächlich geschriebenen Bytes“, aus irgendeinem Grund, damit es nicht in einem einzigen Aufruf sofort alle Daten schreiben können „Verbindung: didReceiveData:“ , wodurch die Verwendung der do / while-Schleife für diese zu überprüfen. Aber in diesem Beispiel alle schreibt sie die Daten in einem einzigen do / while Iteration.

Sie können aber auch eine NSFileHandle verwenden stattdessen, und dies wird die gesamten Daten immer schreibt mit jeder Verbindung gesendet: didReceiveData: Anruf, auch inkrementelle es ist. Beachten Sie jedoch, dass writedata:. Synchron

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    // write data to file handler
    unsigned long long dataLength = [data length];

    NSLog(@"Writing %qu bytes at %qu bytes", dataLength, [self.fileHandle offsetInFile]);
    [self.fileHandle writeData:data];
    NSLog(@"Wrote %qu bytes, now at %qu bytes", dataLength, [self.fileHandle offsetInFile]);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top