@@ -63,6 +63,16 @@ public final class SwiftQueueManager {
63
63
/// Schedule a job to the queue
64
64
/// TODO Need to remove this method
65
65
public func enqueue( info: JobInfo ) {
66
+ if let thread = params. enqueueThread {
67
+ thread. sync ( flags: . barrier) {
68
+ enqueueInMainThread ( info: info)
69
+ }
70
+ } else {
71
+ enqueueInMainThread ( info: info)
72
+ }
73
+ }
74
+
75
+ private func enqueueInMainThread( info: JobInfo ) {
66
76
let queue = getQueue ( queueName: info. queueName)
67
77
let job = queue. createHandler ( type: info. type, params: info. params)
68
78
let constraints = info. constraints
@@ -167,14 +177,17 @@ internal struct SqManagerParams {
167
177
168
178
var initInBackground : Bool
169
179
180
+ var enqueueThread : DispatchQueue ?
181
+
170
182
init ( jobCreator: JobCreator ,
171
183
queueCreator: QueueCreator ,
172
184
persister: JobPersister = UserDefaultsPersister ( ) ,
173
185
serializer: JobInfoSerializer = DecodableSerializer ( maker: DefaultConstraintMaker ( ) ) ,
174
186
logger: SwiftQueueLogger = NoLogger . shared,
175
187
listener: JobListener ? = nil ,
176
188
initInBackground: Bool = false ,
177
- dispatchQueue: DispatchQueue = DispatchQueue . global ( qos: DispatchQoS . QoSClass. utility)
189
+ dispatchQueue: DispatchQueue = DispatchQueue . global ( qos: DispatchQoS . QoSClass. utility) ,
190
+ enqueueThread: DispatchQueue ? = nil
178
191
) {
179
192
self . jobCreator = jobCreator
180
193
self . queueCreator = queueCreator
@@ -184,6 +197,7 @@ internal struct SqManagerParams {
184
197
self . listener = listener
185
198
self . initInBackground = initInBackground
186
199
self . dispatchQueue = dispatchQueue
200
+ self . enqueueThread = enqueueThread
187
201
}
188
202
189
203
}
@@ -242,6 +256,14 @@ public final class SwiftQueueManagerBuilder {
242
256
return self
243
257
}
244
258
259
+ /// Use a single DispatchQueue to enqueue jobs
260
+ /// This can solve crashes when calling 'enqueue' in a multi-thread environment
261
+ public func set( enqueueDispatcher: DispatchQueue ) -> Self {
262
+ params. enqueueThread = enqueueDispatcher
263
+ return self
264
+ }
265
+
266
+
245
267
/// Get an instance of `SwiftQueueManager`
246
268
public func build( ) -> SwiftQueueManager {
247
269
return SwiftQueueManager ( params: params, isSuspended: isSuspended)
0 commit comments