• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 如何在后台同步进行api调用?

[复制链接]
菜鸟教程小白 发表于 2022-12-12 11:24:16 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有四个 api 调用要做。它们应按以下顺序排列:

apiSyncDataToCloud;

apiSyncImagesToServer;

apiDeleteDataFromCloud;

apiSyncDataFromCloudInBackground;

无论前一个是成功还是失败,都将调用它们中的每一个。

此外,它们每个都有成功和失败完成 block 。

成功完成 block 数据库更新。

所有这些过程都必须在后台中执行,并且必须完成 没有次数。 Api 调用当然是在后台执行的,但是一旦调用完成,就会在主线程上执行数据库更新,从而卡住应用程序。

所以,我采用了几种解决方案:

尝试了以下代码:

NSOperationQueue *queue = [NSOperationQueue new];

queue.maxConcurrentOperationCount = 1;


[queue  addOperationWithBlock:^{
     [self apiSyncDataToCloud];
}];

[queue  addOperationWithBlock:^{
    [self apiSyncImages];
}];

[queue  addOperationWithBlock:^{
    [self apiDeleteDataFromCloud];
}];

[queue  addOperationWithBlock:^{
    [self apiSyncDataFromCloudInBackground];
}];

但这只能保证api方法调用会按顺序执行。但他们的结果没有特定的顺序。也就是说,方法调用将按照指定的顺序进行,但 apiSyncImagesToServer 的成功 block 可能会在 apiSyncDataToCloud 的成功 block 之前被调用。

然后我采用了以下解决方案:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self apiSyncDataToCloud];
});

在 apiSyncDataToCloud 的成功和失败 block 中,我调用了 apiSyncImagesToServer。这也没有用。

现在我只是使用我的最后一个解决方案。我只是在调用 apiSyncDataToCloud。

在成功完成 block 中,该方法首先更新数据库,然后调用其他api。

在失败完成 block 中,此方法只是简单地进行 api 调用而不更新数据库。

例如-

apiSyncDataToCloud 结构如下:

-(void)apiSyncDataToCloud{

NSLog(@"method 1");

NSMutableDictionary *dicDataToBeSynced = [NSMutableDictionary dictionary];
dicDataToBeSynced = [self getDataToBeSynced];

if (dicDataToBeSynced.count!=0) {
    if ([[StaticHelper sharedObject] isInternetConnected]) {

        [[ApiHandler sharedObject] postRequestWithJsonString:API_SYNC_DATA_TO_CLOUD andHeader:[UserDefaults objectForKey:kAuthToken] forHeaderField:kAccessToken andParameters:dicDataToBeSynced WithSuccessBlock:^(NSURLResponse *response, id resultObject, NSError *error) {

            NSLog(@"Data synced successfully to server");
            [self updateColumnZSYNC_FLAGForAllTables];//updating db
            [self apiSyncImagesToServer];//api call


        } andFailureBlock:^(NSURLResponse *task, id resultObject, NSError *error) {
            NSLog(@"Data syncing to cloud FAILED");
            [self apiSyncImagesToServer];//simply make api call without updating db

        }];
    }
}else{
    [self apiSyncImagesToServer];make api call even if no data to be synced found

}

}

类似,在 apiSyncImagesToServer 内部我调用 apiDeleteDataFromCloud.....

因此,我的问题仍然存在。成功阻止更新数据库,下载图像...所有操作都在主线程上执行时,应用程序卡住。

请告诉我一个更清洁、更好的解决方案。



Best Answer-推荐答案


您可以一一创建自己的自定义队列和调用请求。 即

dispatch_queue_t myQueue;//declare own queue

if (!myQueue) {//check if queue not exists
        myQueue = dispatch_queue_create("com.queue1", NULL); //create queue
}
dispatch_async(myQueue, ^{[self YOUR_METHOD_NAME];});//call your method in queue block

如果您想在接收到数据后更新一些 UI,请在主线程上更新 UI。

关于ios - 如何在后台同步进行api调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37405732/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap