mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 22:55:00 +00:00
FetchV2 improvements
This commit is contained in:
@@ -15,6 +15,7 @@ import PersistentStringHash
|
||||
import CallKit
|
||||
import AppLockState
|
||||
import NotificationsPresentationData
|
||||
import RangeSet
|
||||
|
||||
private let queue = Queue()
|
||||
|
||||
@@ -1187,7 +1188,7 @@ private final class NotificationServiceHandler {
|
||||
fetchMediaSignal = Signal { subscriber in
|
||||
final class DataValue {
|
||||
var data = Data()
|
||||
var totalSize: Int64?
|
||||
var missingRanges = RangeSet<Int64>(0 ..< Int64.max)
|
||||
}
|
||||
|
||||
let collectedData = Atomic<DataValue>(value: DataValue())
|
||||
@@ -1217,12 +1218,22 @@ private final class NotificationServiceHandler {
|
||||
useMainConnection: true
|
||||
).start(next: { result in
|
||||
switch result {
|
||||
case let .dataPart(_, data, _, _):
|
||||
case let .dataPart(offset, data, dataRange, _):
|
||||
var isCompleted = false
|
||||
let _ = collectedData.modify { current in
|
||||
let current = current
|
||||
current.data.append(data)
|
||||
if let totalSize = current.totalSize, Int64(current.data.count) >= totalSize {
|
||||
|
||||
let fillRange = Int(offset) ..< (Int(offset) + data.count)
|
||||
if current.data.count < fillRange.upperBound {
|
||||
current.data.count = fillRange.upperBound
|
||||
}
|
||||
current.data.withUnsafeMutableBytes { buffer -> Void in
|
||||
let bytes = buffer.baseAddress!.assumingMemoryBound(to: UInt8.self)
|
||||
data.copyBytes(to: bytes.advanced(by: Int(offset)), from: Int(dataRange.lowerBound) ..< Int(dataRange.upperBound))
|
||||
}
|
||||
current.missingRanges.remove(contentsOf: Int64(fillRange.lowerBound) ..< Int64(fillRange.upperBound))
|
||||
|
||||
if current.missingRanges.isEmpty {
|
||||
isCompleted = true
|
||||
}
|
||||
return current
|
||||
@@ -1235,8 +1246,8 @@ private final class NotificationServiceHandler {
|
||||
var isCompleted = false
|
||||
let _ = collectedData.modify { current in
|
||||
let current = current
|
||||
current.totalSize = size
|
||||
if Int64(current.data.count) >= size {
|
||||
current.missingRanges.remove(contentsOf: size ..< Int64.max)
|
||||
if current.missingRanges.isEmpty {
|
||||
isCompleted = true
|
||||
}
|
||||
return current
|
||||
|
||||
Reference in New Issue
Block a user