gpt4 book ai didi

iphone - iOS - 在后台执行写入核心数据的多个 AFJSONRequestOperations

转载 作者:行者123 更新时间:2023-11-29 11:04:49 25 4
gpt4 key购买 nike

我无法确定管理应用程序 SQLite 数据库更新的最佳方式(使用 Core Data)

当我的应用程序启动时,它会访问服务器以确定哪些表需要更新。然后,我为每个表调用服务。一旦我为每个对象取回 JSON,它就会在我的 SQLite 数据库中创建/更新相应的对象。

我正在做的事情是有效的,因为它执行每个请求并更新每个需要的表——但我认为我没有正确地做这件事。

这样做仍然会锁定我的 UI 线程,我需要能够每隔 10 分钟左右在后台异步运行此代码。

AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {


NSMutableArray *operations = [NSMutableArray new];

//for each of the tables that need updating, create a AFJSONRequestOperation
for(NSString *str in [JSON valueForKey:@"Views"])
{

NSString* path = [NSString stringWithFormat:@"cache/%@/?deviceUID=%@&token=%@", str, @"00000-00000-0000-00001", [_globals getToken]];
NSURLRequest* request = [client requestWithMethod:@"GET" path:path parameters:nil];
AFJSONRequestOperation* operation2 = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
{
[self updateTable:str withJSON:JSON];
}
failure:nil];

[operations addObject:operation2];
}

//AFHTTPClient
[client enqueueBatchOfHTTPRequestOperations:operations progressBlock:nil completionBlock:^(NSArray *operations) {
//this gets called way before the objects are done updating to the DB
NSLog(@"DONE ALL REQUESTS");
[_HUD hide:YES]; // getting called after getting all of the JSON not after all tables are updated
}];

} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {

[_HUD hide:YES];

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Failed" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alert show];
}];


[operation start];

这是我的 updateTable 函数,只有 1 个条件

- (void)updateTable:(NSString *)tblName withJSON:(id)JSON
{
for(NSDictionary *record in [JSON valueForKey:@"Records"])
{
NSString *viewName = [[record valueForKey:@"ViewName"] lowercaseString];

//Worker
if([viewName isEqualToString:[[NSString stringWithFormat:@"Worker_vw_iSales"] lowercaseString]])
{
if([Worker doesWorkerExist:[record valueForKey:@"JSONData"]])
{
NSLog(@"deleting old worker");
[ad.managedObjectContext deleteObject:[Worker doesWorkerExist:[record valueForKey:@"JSONData"]]];

}

NSEntityDescription *desc = [NSEntityDescription entityForName:NSStringFromClass([Worker class]) inManagedObjectContext:ad.managedObjectContext];
Worker *worker = [[Worker alloc] initWithEntity:desc insertIntoManagedObjectContext:ad.managedObjectContext];
[worker initWithJSONSting:[record valueForKey:@"JSONData"]];
NSLog(@"Creating Worker: %@", worker.firstName);


}
}
}

我希望这不会太困惑——如果是这样,我可以尝试解释更多。

我可能完全错了,如果我错了,请告诉我。我尝试了一些其他的东西,包括使用 NSOperationQueue 而不是 AFHHTTPs enqueueBatchOfHTTPRequestOperations:requests 但我无法获得我正在寻找的行为。

谢谢!

最佳答案

您现在要查找的是 AFJSONRequestOperation 上的 setSuccessCallbackQueue:。除非另有说明,否则 AFNetworking 将其所有成功 block 设置为在主队列上运行。

我做的是

@implementation myClass {
dispatch_queue_t backgroundQueue;
}

- (id)init
{
if (self = [super init]){
backgroundQueue = dispatch_queue_create("com.proj.myClass", 0);
}
return self;
}

- (void)doSomeStuff
{
NSMutableURLRequest *request = [[myAFAPIClient sharedClient] requestWithMethod:@"GET" path:path parameters:params];
AFJSONRequestOperation *myOperation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
//Success Block
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
}];
[myOperation setSuccessCallbackQueue:backgroundQueue];
[[myAFAPIClient sharedClient].operationQueue addOperation:myOperation];
}

所以不同之处在于您正在排队操作,而我只是将它们直接添加到客户端。

此外,在我有//Success Block 的地方,我做了各种各样的事情,例如将其他方法分派(dispatch)到 backgroundQueue,这些方法发出更多 JSON 请求,我没有任何问题。

关于iphone - iOS - 在后台执行写入核心数据的多个 AFJSONRequestOperations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14164971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com