- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我无法确定管理应用程序 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/
我想按顺序执行一系列 AFJSONRequestOperation,并且能够在失败时中断队列。 目前我的做法并不靠谱,因为有时下一次手术会得到机会开始。 我有一个单例来调用我的 api 端点 AFJS
使用 AFNetworking 的请求: NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue setMaxC
我正在尝试从服务于 JSON 的 Web 服务获取一些数据。但是我不知道我的代码出了什么问题。它看起来很简单,但我无法获得任何数据。 这是代码: NSURLRequest *request = [NS
一整天都被困在这个问题上,并尽快寻求帮助来解决这个问题。任何帮助都会很棒。谢谢:-) 缺少的引号 从网络上得到这个 AFJSONRequestOperation 请求,它很好地解决了一个关键错误:某些
我无法确定管理应用程序 SQLite 数据库更新的最佳方式(使用 Core Data) 当我的应用程序启动时,它会访问服务器以确定哪些表需要更新。然后,我为每个表调用服务。一旦我为每个对象取回 JSO
我有一个 NSOperation,Authenticate,它通过服务器进行身份验证。 我有另一个操作,类型为 AFJSONRequestOperation 的 fetchImage,它依赖于 Aut
我使用 AFNetworking 将数据发送到删除 Web 服务,并使用以下 block : self.operation = [AFJSONRequestOperation JSONRequestO
我有以下运行良好的代码,但我需要对其进行更多控制,尤其需要在 0.9 中开始使用 Reachability 代码。 NSString *urlString = [NSString stringWith
我正在尝试使用 AFJSONRequestOperation 从 JSON 提要中提取少量数据。 以下代码可以很好地提取 url,并且在打印 stringURL 时,它会打印出正确的 url。但是,我
我正在修复现有项目中的错误。问题是 AFHTTPClient 期望有效的 JSON 响应,但服务器返回一些乱码,如“”\”操作完成\””(所有引号和括号都在返回中)。这导致操作失败,并命中失败 blo
我已经实现了 AFNetworking 框架,但是我试图找出一种在单独的类中使用 AFJSONRequestOperation 函数并从我的个人 View Controller 调用它的方法。 我所做
我刚开始在 iOS 中使用 block ,我认为这可能是我问题的症结所在。 我只想构建一个简单的静态 DataManager 类,它的唯一工作就是从我的 Restful 服务中获取数据。 我会从我所有
我正在使用 AFNetworking 将 json 数据发布到我的网络服务并获得 json 响应。但是现在我还想向这些 POST 添加多部分表单数据。如果我这样做(即使没有我首先添加的参数),完成 b
我正在尝试使用 AFNetworking 和 AFJSONRequestOperation 发送授权 header 。如果我在 setAuthorizationHeaderWithToken 之后 N
将json数据发送到服务器并希望使用AFNetworking从服务器获取正确的response.statusCode 服务器: // Helper method to send a HTTP resp
我正在使用 AFNetworking 库检索 JSON 数据,并想添加一个完成 block ,如下所示: -(void)getData{ NSString *link=@"http://loc
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://twitter.c
The following code is taken from this tutorial 我以前使用过这个片段,但我以前从未注意到这个问题。数组内容的 NSLog 在委托(delegate)方法中
我一直试图在将请求分派(dispatch)到需要 OAuth 身份验证的基于 REST 的服务的特定实例中掌握 AFHTTPClient。使用 GTMOAuth 创建 OAuth 身份验证没有问题。
我在第 6 行的这段代码中收到上述警告,并且 userInfo 在该 block 中也变为 nil。请提出一些建议来消除此警告和 userInfo 问题。 AFHTTPClient *httpClie
我是一名优秀的程序员,十分优秀!