9521


Parseを使ってデータをやり取りする実装を行っていますが、2点ご質問があります。  
目的：clip classを作成し、別の値を返し、成功を取得したい。

  1. `return clipObjects` で、`[PFObject] is not convertible to "Void"` というエラーが起きる理由
  2. backgroundで処理しているので、成功時に処理をするというクロージャの書き方

[code]

    class Clip {
    
        class var sharedInstance : Clip {
            struct Static {
                static let instance : Clip = Clip()
            }
            return Static.instance
        }
    
        func apiCall() {
            var currentUser:PFUser! = PFUser.currentUser()
            var clip = PFObject(className: "Clip")
            var query = PFQuery(className: "Clip")        
            query.whereKey("user", equalTo: currentUser.username!)        
            query.findObjectsInBackgroundWithBlock{ (objects,error) -> Void in
    
                if let clipObjects = objects as? [PFObject] {
                    println("clipObjects ------------------ \(clipObjects)")
                    return clipObjects
                }
            }
        }
    }
    
[/code]

ViewController

[code]

    class ViewController : UIViewController{
        var clipData : [PFObject] = []
        override func viewDidLoad() {
            super.viewDidLoad()
    
            var clip = Clip.sharedInstance
    
            var clipData = clip.apiCall()
            self.tableView.reloadData()
    
            clip.apiCall{(success:[AnyObject]?,data:[AnyObject]?) -> Void in
                   // clip classから渡ってきたデータをself.clipDataに入れたい
                   self.clipData = data
                   self.tableView.reloadData()
            }
        }
    }
    
[/code]

以上ですが、アドバイスいただけますと幸いです。  
よろしくお願い致します。


CC BY-SA 3.0
2015-04-24T02:22:30.323
9520
2015-04-24T15:48:52.847
2015-04-24T15:48:52.847
49
5969
question
swift
Swiftで関数の実行結果を別ファイルの変数に渡したい。


### 1. エラーが起きる理由

これはapiCall()の宣言で、戻り値が指定されていないのが原因です。エラーを解消するためには、次のようになると思われます。

[code]

    func apiCall() -> [PFObject]? {
    
        // 省略
    
    }
    
[/code]

そもそも、引数の型も書かれてないので、その部分でもエラーになってそうですが。

### 2. 成功時に処理をする

これは単純に、成功時に処理したいクロージャを渡すだけで問題ないかと思われます。

### まとめ

上記の2つの問題点を考えると、こんな感じになるかと思います。

apiCall()の実装

[code]

    func apiCall(finish: ((objects:[AnyObject]!, error: NSError!)->Void)) {
    
        // 何らかの処理
    
        // 終了時、クロージャを呼び出し
        finish(objects: objects, error: error)
    }
    
[/code]

apiCall()の呼び出し側

[code]

    apiCall() { objects, error in
    
        // 終了時に呼ばれるクロージャ
        // 別スレッドから呼ばれる場合、GUIの操作はメインスレッドで
    
    }
    
[/code]

apiCall()から呼ばれるクロージャで処理が完結するため、結果的に戻り値は不要になってます。


CC BY-SA 3.0
2015-04-24T05:23:50.243
9521
2015-04-24T05:23:50.243
7459
9520
answer