Alamofire多次请求迭代

时间:2016-09-12 20:48:13

标签: swift request alamofire

我的申请中有四个不同的请求,其中三个只需要一个电话,最后一个需要1到10个。

在我遍历数据并进行调用时,一切正常,直到最后一个请求。这是我在 Class1

中的代码
var data = ...
var points = ...

// I create a new group
let getPointGroup = dispatch_group_create()

// I iterate through my data
for d in data{
    // I enter the group
    dispatch_group_enter(getPointGroup)
    dataService.getPoints(d.point), success: { points -> Void in
        points.append(points)

        // I leave the group so that I go to the next iteration
        dispatch_group_leave(getPointGroup)
    }
}

Alamofire请求在 Class2

中看起来像这样
let headers = [
    "Authorization": "Bearer \(token)",
    "Content-Type": "application/x-www-form-urlencoded"
]

Alamofire.request(.GET, url, headers:headers)
    .responseJSON { response in
        switch response.result {
        case .Success:
            let json = JSON(data: response.data!)
            print(json)
            success(json)
        case .Failure(let error):
            print(error)
        }
}

但是我从来没有点过GET请求,如果我完全删除了迭代,只要它完美地运行就调用Alamofire请求。

有关如何解决Alamofire迭代请求的任何想法?

修改
不是真的重复,我在不同的类中有下面的片段,示例并没有真正解决我的问题

1 个答案:

答案 0 :(得分:2)

如果没有运行,如果在主线程上使用dispatch_group_wait,则可能会死锁,从而阻塞该线程,并阻止Alamofire运行任何完成处理程序(也需要主线程)。这已经解决了(假设您确实使用dispatch_group_wait),将其替换为dispatch_group_notify

因此:

let group = dispatch_group_create()

for d in data {
    // I enter the group
    dispatch_group_enter(group)
    dataService.getPoints(d.point)) { additionalPoints, error in
        defer { dispatch_group_leave(group) }

        guard let let additionalPoints = additionalPoints else {
            print(error)
            return
        }

        points.append(additionalPoints)
    }
}

dispatch_group_notify(group, dispatch_get_main_queue()) {
    // go to the next iteration here
}

其中:

func getPoints(point: WhateverThisIs, completionHandler: (JSON?, NSError?) -> ()) {
    let headers = [
        "Authorization": "Bearer \(token)"
    ]

    Alamofire.request(.GET, url, headers: headers)
        .responseJSON { response in
            switch response.result {
            case .Success:
                let json = JSON(data: response.data!)
                completionHandler(json, nil)
            case .Failure(let error):
                completionHandler(nil, error)
            }
    }
}

现在,我不知道你的各种参数类型是什么,所以我只能猜测,所以不要迷失在那里。但关键是(a)你应该确保你的Alamofire方法中的所有路径都会调用完成处理程序; (b)调用者应该使用dispatch_group_notify而不是dispatch_group_wait,以避免阻塞任何线程。

注意,为了使完成处理程序可以调用,即使网络请求失败,我也必须使该闭包的参数可选。当我在那里时,我也添加了一个可选的错误参数。

上述示例中包含的一些不相关的更改:

  1. 我建议为闭包的参数使用不同的变量名。原始代码段中的points.append(points)表示您的points数组与关闭时传回的points之间存在一些混淆。

  2. 您无需设置Content-Type标题,因为Alamofire会为您执行此操作。

  3. 我没有在上面更改它,但使用responseJSON(使用NSJSONSerialization解析JSON)然后使用SwiftyJSON解析原始{{1}是低效的}再次与data。就个人而言,我不打扰SwiftyJSON,但如果你想使用它,我建议使用Alamofire的NSJSONSerialization方法而不是response。解析JSON两次没有意义。

相关问题