2016-11-25 3 views
1

Я добавил систему привязки Rebekka к моему проекту Swift 3 для загрузки файлов по FTP.Swift 3 - Загрузка по FTP

Я использовал быстрый инструмент 3 преобразования в Xcode и я остался только с одной ошибкой

Значение типа «NSMutableData» имеет «количество» ни один член

А вот где это происходит:

let bytes = self.inputData!.bytes.bindMemory(to: UInt8.self, capacity: self.inputData!.count) 

Полнофункциональный:

override func streamEventEnd(_ aStream: Stream) -> (Bool, NSError?) { 
    var offset = 0 
    let bytes = self.inputData!.bytes.bindMemory(to: UInt8.self, capacity: self.inputData!.count) 
    let totalBytes = CFIndex(self.inputData!.length) 
    var parsedBytes = CFIndex(0) 
    let entity = UnsafeMutablePointer<Unmanaged<CFDictionary>?>.allocate(capacity: 1) 
    var resources = [ResourceItem]() 
    repeat { 
     parsedBytes = CFFTPCreateParsedResourceListing(nil, bytes.advancedBy(offset), totalBytes - offset, entity) 
     if parsedBytes > 0 { 
      let value = entity.pointee?.takeUnretainedValue() 
      if let fptResource = value { 
       resources.append(self.mapFTPResources(fptResource)) 
      } 
      offset += parsedBytes 
     } 
    } while parsedBytes > 0 
    self.resources = resources 
    entity.deinitialize() 
    return (true, nil) 
} 

Кто-нибудь знает быстрый 3 эквивалент self.inputData!.count?

+2

, что о '' self.inputData .length –

+1

Попробуйте использовать '.length' недвижимость из 'Data' –

+0

Я пытаюсь это сейчас, я обновлю вопрос, если он работает –

ответ

0

Как указывается в комментариях, которые я использовал .Length, чтобы получить эту работу, наряду с некоторыми другими незначительными изменениями, как показано ниже:

override func streamEventEnd(_ aStream: Stream) -> (Bool, NSError?) { 
    var offset = 0 
    let bytes = self.inputData!.bytes.bindMemory(to: UInt8.self, capacity: self.inputData!.count) 
    let totalBytes = CFIndex(self.inputData!.length) 
    var parsedBytes = CFIndex(0) 
    let entity = UnsafeMutablePointer<Unmanaged<CFDictionary>?>.allocate(capacity: 1) 
    var resources = [ResourceItem]() 
    repeat { 
     parsedBytes = CFFTPCreateParsedResourceListing(nil, bytes.advancedBy(offset), totalBytes - offset, entity) 
     if parsedBytes > 0 { 
      let value = entity.pointee?.takeUnretainedValue() 
      if let fptResource = value { 
       resources.append(self.mapFTPResources(fptResource)) 
      } 
      offset += parsedBytes 
     } 
    } while parsedBytes > 0 
    self.resources = resources 
    entity.deinitialize() 
    return (true, nil) 
} 

тогда я получил некоторые ошибки при связывая использовать Ревекка прикосновение, пример использования Бесполезный так что я немного изменился, как показано ниже:

var configuration = SessionConfiguration() 
      configuration.host = "ftp.somewebsite.co.uk" 
      configuration.username = "username" 
      configuration.password = "password" 
      let URL = filename 
       let path = "/"+currentJob.ReservationsID+".png" 
       Session(configuration: configuration).upload(URL, path: path) { 
        (result, error) -> Void in 
        print("Upload file with result:\n\(result), error: \(error)\n\n") 

      } 
1

Я использую Swift3. Я внес следующие изменения в исходный код структуры Rebekka, в частности, файл ResourceListOperation.swift. (Примечание: расширенный (по: ..), .length).

fileprivate var inputData: NSMutableData? 
var resources: [ResourceItem]? 

override func streamEventEnd(_ aStream: Stream) -> (Bool, NSError?) { 
    var offset = 0 
    let bytes = self.inputData!.bytes.bindMemory(to: UInt8.self, capacity: self.inputData!.length) 
    let totalBytes = CFIndex(self.inputData!.length) 
    var parsedBytes = CFIndex(0) 
    let entity = UnsafeMutablePointer<Unmanaged<CFDictionary>?>.allocate(capacity: 1) 
    var resources = [ResourceItem]() 
    repeat { 
     parsedBytes = CFFTPCreateParsedResourceListing(nil, bytes.advanced(by: offset), totalBytes - offset, entity) 
     if parsedBytes > 0 { 
      let value = entity.pointee?.takeUnretainedValue() 
      if let fptResource = value { 
       resources.append(self.mapFTPResources(fptResource)) 
      } 
      offset += parsedBytes 
     } 
    } while parsedBytes > 0 
    self.resources = resources 
    entity.deinitialize() 
    return (true, nil) 
} 

Вот что я использовал в моем приложении к списку каталог после импорта RebekkaTouch рамки:!?

var configuration = SessionConfiguration() 
    configuration.host = "<ip-address:followed-by-port>" 
    configuration.username = "uname" 
    configuration.password = "password" 
    configuration.encoding = String.Encoding.utf8 
    self.session = Session(configuration: configuration) 
    self.session.list("/") { 
     (resources, error) -> Void in 
     print("List directory with result:\n\(String(describing: resources)), error: \(String(describing: error))\n\n") 
    } 
Смежные вопросы