0

Rubymotion を使用して iOS アプリを作成しています。画像のマルチパート アップロードを作成しようとしています。

このコードを使用してアップロードを行いますが、エラーが発生します:

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' })

request オブジェクトはこれを出力します:

<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>
4

2 に答える 2

1

メソッドの署名は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を参照してください。

于 2012-12-12T23:44:26.393 に答える
0

この種の作業を行うクラスを作成しました。ここで私の答えをチェックしてください。AFNetworking を使用し、基本的なネットワーク要求のメソッドが含まれています。

于 2012-12-12T18:45:18.363 に答える