繁体   English   中英

openParentApplication:reply:包含app的异步网络调用错误

[英]openParentApplication:reply: error with asynchronous network call in containing app

使用我的Watchkit应用程序时,我遇到了错误。 当我启动它时,我要求包含iOS应用程序从网络获取一些数据。 问题是我得到一个错误,说包含应用程序从不调用'reply()':o但是看看我的代码,它应该调用它。

我试图调试从openParentApplication到'reply()'调用的每一步,它似乎运行良好= X.

这是我在Watchkit扩展中的代码

- (void)initDiaporamasWithSuccess:(void (^)())success andFailure:(void (^)(NSError*))failure {
NSLog(@"Ask to load diapos");
__weak typeof(self) weakSelf = self;
[WKInterfaceController openParentApplication:@{@"watchKit": @"watchKit.initDiapos"} reply:^(NSDictionary *replyInfo, NSError *error) {
    if (error) {
        NSLog(@"%@", error);
        if (failure) {
            failure(error);
        }
        return;
    }

    NSLog(@"got items : %@", replyInfo[@"diapos"]);
    weakSelf.diaporamas = replyInfo[@"diapos"];
    [weakSelf setDiaporama:replyInfo[@"firstDiapo"] AtIndex:0];
    if (success) {
        success();
    }
}];

}

结果应该是一个NSDictionary包含一个带有一些diaporamas基本信息的NSArray,一个包含第一个diaporama完整信息的对象(Diapo)(例如self.diaporamas [0])

以下是包含应用程序的AppDelegate中的代码:

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply {
// Maybe we could handle multiple watchKit extension calls that way ?
// Something like a key-value 'protocol' to run the right block of code
NSString *watchKitCall = userInfo[@"watchKit"];
NSLog(@"watchKit handled");

if ([watchKitCall isEqualToString:@"watchKit.initDiapos"]) {
    [AppDelegate watchInitialObjects:^(NSDictionary *info) {
        NSLog(@"Managed to get initial infos");
        reply(info);
    } failure:^(NSError *error) {
        NSLog(@"Fail : %@", error);
        reply(@{@"error": error});
    }];
}

}

+ (void) watchInitialObjects:(void (^)(NSDictionary *info))success failure:(void (^)(NSError *error))failure {
NSDictionary *parameters = @{@"site" : @(14), @"limit" : @(10)};
[AppDelegate  requestDiapoListWithParams:parameters success:^(NSArray *items) {
    if ([items count] == 0)
    {
        NSError *error = [NSError errorWithDomain:@"com.domain.app" code:404 userInfo:nil];
        failure(error);
        return;
    }

    Diapo *firstDiapo = [items firstObject];
    [AppDelegate requestDiapoDetailWithDiapo:firstDiapo success:^(Diapo *diapo) {
        if (!diapo)
        {
            NSError *error = [NSError errorWithDomain:@"com.domain.app" code:404 userInfo:nil];
            failure(error);
            return;
        }

        NSDictionary *result = @{
                                 @"firstDiapo" : diapo,
                                 @"diapos" : items
                                 };
        success(result);
    } failure:^(NSError *error) {
        failure(error);
    }];
} failure:^(NSError *error) {
    failure(error);
}];

}

在watchKitHandler中,我调用watchInitialObjects来获取diaporamas数组和第一个diaporama的信息。 在watchInitialObjects中,我进行了第一次网络调用以获取数组,并且在成功时,我进行了另一个网络调用以获取第一个diaporama信息。

为了进行调用并将JSON映射到对象中,我使用RESTKit

我真的没有得到什么可能是错误= x

UPDATE

我忘记写错误了,这里是:

Error Domain = com.apple.watchkit.errors Code = 2“iPhone App中的UIApplicationDelegate从未调用reply() - [UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]”UserInfo = 0x7fcb53e12830 {NSLocalizedDescription = iPhone App中的UIApplicationDelegate从不调用reply() - [UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]}

我一直试图知道为什么会出现这个错误,我想我发现了它:似乎有一个(很少)超时来完成包含应用程序中的工作。 但是我直接在包含应用程序中映射了我收到的JSON数据,然后在reply()中发送这些自定义对象。 但是当我删除映射部分时,它运行良好!

所以...这就是为什么我认为这就是问题= X有人可以批准我的想法或纠正我吗?

经过几个小时的搜索和测试不同的代码,我终于找到了我的问题...当我们阅读关于'application:handleWatchKitExtensionRequest:回复:'的Apple文档时,这是显而易见的......

这是答案:(它在文档中)

字典的内容必须可序列化为属性列表文件。

这意味着对象只能是字典,数组,字符串,数字(整数和浮点数),日期,二进制数据或布尔值

......我感到愚蠢> <

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM