【发布时间】:2016-04-27 17:51:59
【问题描述】:
我已经阅读了很多关于如何使用锁的不同建议 - 但我当前的代码在 IOS 和 Android 中的行为不正确。
我正在尝试使用 HTTP 请求构建队列系统。如果一个请求失败,它应该是第一个被重试的请求。发送和添加到队列都是在同一个方法中,所以在前一个请求完成之前,它不会将新对象添加到队列中。如果一个失败并且当添加下一个请求时,它将发送两个请求(在同一个包中并清除队列)。
安卓:
// Java
synchronized(locker)
{
Add object to a queue if there is a new object to be added
If any objects in queue - send request with AsyncTask
}
IOS:
// Objective-C
@synchronized(locker)
{
Add object to a queue if there is a new object to be added
If any objects in queue - send request with NSURLSessionDataTask
}
...失败时,不要从队列中删除对象。
在这种情况下 - 我猜锁确实被释放了,另一个线程可能会立即发送下一个请求并首先发送,因为任务是在另一个线程中分派的?
我尝试过使用普通锁,在 Android 上取得了一些成功,在 iOS 上完全失败,整个系统都冻结了。从那时起,我已经阅读了关于锁定 IOS 上的锁,它必须由同一个线程解锁 - 整个方法上的 dispatch_async(dispatch_get_main_queue()... 是否可以工作,或者我是否必须在 CompletionHandler 完成时再次分派它? 我可以确定completionHandler 是在与创建它的方法相同的线程上调用的吗?
以正确的顺序发送每个包裹非常重要。像这样的多线程 HTTP 请求系统的最佳方法是什么?
【问题讨论】:
-
你的问题对我来说没有多大意义。 “发送和添加到队列都是使用相同的方法,因此在前一个请求完成之前,它不应将新对象添加到队列中”。这不会让它不是一个队列吗?如果在发送最后一个请求之前无法添加新请求?另外,为什么要实现自己的锁定而不是使用 ConcurrentLinkedQueue 等?我也不明白你遇到了什么问题,你解释得不好。
标签: android ios multithreading locking httprequest