【发布时间】:2015-03-19 09:36:55
【问题描述】:
我在使用 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,其中包含一个带有一些 diaporama 基本信息的 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
更新
我忘了写我得到的错误,这里是:
Error Domain=com.apple.watchkit.errors Code=2 "iPhone App 中的 UIApplicationDelegate 从未在 -[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:] 中调用 reply()" UserInfo=0x7fcb53e12830 {NSLocalizedDescription=The UIApplicationDelegate in the iPhone App 从未在 -[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]} 中调用 reply()
我一直想知道为什么会出现这个错误,我想我找到了: 似乎有一个(非常少的)超时来完成包含应用程序中的工作。但是我直接在包含的应用程序中映射了我收到的 JSON 数据,然后在回复()中发送这些自定义对象。但是当我删除映射部分时,它运行良好!
所以...这就是为什么我认为这是问题所在 =X 有人可以批准我的想法或纠正我吗?
【问题讨论】:
-
还有其他错误详情吗?手表是否超时,应用没有及时回复?
标签: ios objective-c networking restkit watchkit