Невозможно использовать AFNetworking для загрузки изображения

Я создаю приложение для iOS с помощью Rubymotion. Я пытаюсь загрузить изображение из нескольких частей.

Я использую этот код для загрузки, но получаю сообщение об ошибке:

data = {token: "2xCGdzcuEeNzhst3Yaa8f", task: 1, message: "message", latitude: 1, longitude: 1}

    client = AFHTTPClient.alloc.initWithBaseURL(NSURL.URLWithString("http://api.example.com/api/v1/"))

        request = client.multipartFormRequestWithMethod('POST', path:"messages", parameters:data, constructingBodyWithBlock:lambda{ |form_data|
          image_data = UIImagePNGRepresentation(image.image)
          form_data.appendPartWithFileData(image_data, name:'new_avatar', fileName:'new_avatar.png', mimeType:'image/png')
        })

        operation = AFJSONRequestOperation.alloc.initWithRequest(request)
        operation.setCompletionBlockWithSuccess(lambda{ |operation, responseObject| puts 'all done!'})

Я получаю эту ошибку:

undefined method `setCompletionBlockWithSuccess' for #<AFJSONRequestOperation:0xb227f00> (NoMethodError)

Насколько я могу судить, операция является допустимым объектом и должна иметь этот метод. Я что-то упустил?

Обновление 1

Это мой обновленный код, но когда я его запускаю, действие POST не срабатывает. Мне все еще не хватает кода? Ошибок тоже не возникает.

data = {token: "2xCGdzcuEeNzhs5tYaa8f", task: 1, message: "message", latitude: 1, longitude: 1}

    client = AFHTTPClient.alloc.initWithBaseURL(NSURL.URLWithString("http://api.example.com/api/v1/"))

    request = client.multipartFormRequestWithMethod('POST', path:"messages", parameters:data, constructingBodyWithBlock:lambda{ |form_data|
      image_data = UIImagePNGRepresentation(image.image)
      form_data.appendPartWithFileData(image_data, name:'new_avatar', fileName:'new_avatar.png', mimeType:'image/png')
    })

    operation = AFJSONRequestOperation.alloc.initWithRequest(request)
    operation.setCompletionBlockWithSuccess(lambda { |operation, responseObject| puts 'all done!'},
                                            failure: lambda { |operation, error| puts 'error' })

Объект запроса выводит следующее:

<NSMutableURLRequest:195641792 - url: http://api.example.com/api/v1/messages, 
    headers: {"Content-Length"=>"118200", "Content-Type"=>"multipart/form-data; boundary=Boundary+0xAbCdEfGbOuNdArY", "Accept-Language"=>"en, fr, de, ja, nl, it, es, pt, pt-PT, da, fi, nb, sv, ko, zh-Hans, zh-Hant, ru, pl, tr, uk, ar, hr, cs, el, he, ro, sk, th, id, ms, en-GB, ca, hu, vi, en-us;q=0.8", "User-Agent"=>"theapp/1.0 (iPhone Simulator; iOS 6.0; Scale/1.00)"}, 
    cache policy: 0, Pipelining: false, main doc url: ,    timeout: 60.0, network service type: 0 >

Объект операции выводит следующее:

<AFJSONRequestOperation:0xa78c660>

person Jonathan Clark    schedule 12.12.2012    source источник


Ответы (2)


Сигнатура метода setCompletionBlockWithSuccess(lambda..., failure: lambda...) - вам нужно добавить параметр отказа. Что-то вроде этого:

operation.setCompletionBlockWithSuccess(lambda { |operation, responseObject| puts 'all done!'},
                                        failure: lambda { |operation, error| puts 'error' })

Кроме того, вы должны убедиться, что действительно запустили операцию запроса:

operation.start

См. https://github.com/AFNetworking/AFNetworking/blob/master/AFNetworking/AFJSONRequestOperation.m#L102-L103 для определения этого метода.

person Dylan Markow    schedule 12.12.2012
comment
Спасибо! Я избавился от сообщения об ошибке, но действие POST, похоже, не срабатывает. См. Мой обновленный вопрос. - person Jonathan Clark; 13.12.2012
comment
Вы действительно начали запрос? operation.start - person Dylan Markow; 14.12.2012

Я написал класс для такой работы. Ознакомьтесь с моим ответом ЗДЕСЬ. Он использует AFNetworking и включает методы для основных сетевых запросов.

person LJ Wilson    schedule 12.12.2012
comment
Спасибо, но, к сожалению, я использую Rubymotion (Ruby), а не objective-c. Есть идеи, почему я получаю эту ошибку? - person Jonathan Clark; 12.12.2012
comment
Вы можете установить CocoaPods (motion-cocoapod) и включить AFNetworking в свое приложение RubyMotion, используя pod "AFNetworking" в вашем Rakefile. Подробнее о CocoaPods здесь: github.com/HipByte/motion-cocoapods. - person Jamon Holmgren; 13.12.2012
comment
Да, я использую этот модуль вместе с гемом AFmotion. Не удалось загрузить изображения с этим драгоценным камнем напрямую, поэтому я пробую необработанный код AF. - person Jonathan Clark; 13.12.2012