AFNetworking在调用者的线程

时间:2015-05-13 13:19:28

标签: ios objective-c core-data afnetworking afnetworking-2

我正在使用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;

1 个答案:

答案 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