我正在使用AFNetworking和自定义NSOperations和Core数据,核心数据并发性得到妥善管理,NSOperation使用适当的Managed对象上下文,例如:(是抽象)
// MO created in context A
NSManagedObject * foo = ...;
__Block NSManagedObjectID * fooId = foo.objectID;
NMBlockOperation * customOp = [[NMBlockOperation alloc] initWithBlock:^(NMOperation *operation) {
// MO created in context B
NSManagedObject * safeFoo = [[operation.coreDataManager mocForCurrentThread] objectWithID: fooId];
...
[_networkManager POST:[self apiUrlStringForPath: xxx]
parameters:parameters
success:^(AFHTTPRequestOperation *operation, id responseObject) {
//Do something with the foo object
// MO created in context C
NSManagedObject * safeFoo = [[operation.coreDataManager mocForCurrentThread] objectWithID: fooId];
[operation finish];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
[operation fail];
}];
}];
... add customOp to a queue
我被迫将Managed对象从上下文传递到上下文,因为上下文A,B和C是在不同的线程中创建的,可能强制AFNetworking调用在调用者的线程中执行失败/成功块?使用这种方法,我可以将Managed对象仅从上下文A传递到NSOperation的上下文B.
我知道如何设置网络管理器完成队列,但这对我没有帮助,我想要同一个调用者的线程。
//configure standard network manager
_networkManager = [[AFHTTPRequestOperationManager alloc] init];
//Configure completation queue
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.xxx.afnetComplQueue", NULL);
_networkManager.completionQueue = backgroundQueue;
答案 0 :(得分:2)
AFNetworking在主队列上执行回调块,如此问题的答案所示:
Are AFNetworking success/failure blocks invoked on the main thread?
如果您使用的是GCD,则表示您没有使用"线程"而是与队列。 "线程"块操作一旦完成就会死掉,所以当执行回调时,不可能在同一个线程中调用它,因为它不再存在。我确切地想要实现的目标有点不清楚,但你的问题的答案是否定的,你不能让回调块在相同的线程上执行#34;。
我在线程周围使用引号来表示我的意思是字面意义,因为它与操作系统有关。
修改强>
似乎其他SO问题的答案已不再有效。检查源代码,AFHTTPRequestOperation的完成块在并发队列上执行。这是来源的相关部分:
https://github.com/AFNetworking/AFNetworking/blob/master/AFNetworking/AFHTTPRequestOperation.m#L107