我试图在这个网站上搜索和检查很多问题,但我仍然找不到我的问题的答案。也许有一些类似的问题可以解决我的问题,但我没有足够的经验来了解这一点,请原谅我。
我正在开发一个使用CloudKit存储用户数据的应用程序。所以在一开始,当用户访问我的视图时,我尝试通过以下方法获取其userID:
- (void)initCloudKit{
_container = [CKContainer defaultContainer];
_publicData = [_container publicCloudDatabase];
BOOL __block finished = false;
// get UserID and pass to self.userID
self.userID = [NSString stringWithFormat:@""];
[self.container fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) {
if (error== nil) {
NSLog(@"USER ID: %@", recordID.recordName);
self.userID = [NSString stringWithFormat:@"%@", recordID.recordName];
finished = true;
}else{
NSLog(@"An error occured in %@: %@", NSStringFromSelector(_cmd), error);
}
}];
while (!finished) {
// NSLog(@"loading....");
[self showLoadingScreen];
}
}
一切正常,正如您所看到的,如果还没有返回用户ID,我将通过NSLog显示“正在加载...”。但现在我想向用户显示加载屏幕,而不是向我自己显示此日志。
我有一个名为showLoadingScreen
的方法,可以在加载时添加自定义UIView,但在完成所有内容后会显示。
注意:我把这个方法放在ViewDidLoad()
里面但不知何故,在启动界面打印日志(“loading ...”)?
我的期望是: 1 - 启动启动图像启动应用程序。 2 - 我的主要观点是出现。 3 - 在我请求userID期间,加载屏幕将添加到我的主视图中。 4 - 当我有userID时,加载屏幕消失了(这很容易,所以我没有包含在下面的代码中)
请帮助我,我的问题可能很愚蠢,但我是新手,我还有很多东西值得学习,所以请随时问我任何与此相关的问题。 非常感谢你!
答案 0 :(得分:0)
我想您需要在此while语句之前执行一次,因此您的代码可能如下所示
- (void)initCloudKit{
_container = [CKContainer defaultContainer];
_publicData = [_container publicCloudDatabase];
BOOL __block finished = false;
// get UserID and pass to self.userID
self.userID = [NSString stringWithFormat:@""];
[self.container fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) {
if (error== nil) {
NSLog(@"USER ID: %@", recordID.recordName);
self.userID = [NSString stringWithFormat:@"%@", recordID.recordName];
finished = true;
}else{
NSLog(@"An error occured in %@: %@", NSStringFromSelector(_cmd), error);
}
}];
[self showLoadingScreen];
while (!finished) {
// NSLog(@"loading....");
}
}
答案 1 :(得分:0)
在请求userID时,尝试使用GCD(Grand Central Dispatch)加载LoadingView。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//loading the View
});
答案 2 :(得分:0)
你不必使用while循环,这会影响性能。
开始加载时只需要showLoading,加载结束时,你应该隐藏它。
我向你提出建议:
- (void)initCloudKit{
_container = [CKContainer defaultContainer];
_publicData = [_container publicCloudDatabase];
BOOL __block finished = false;
// get UserID and pass to self.userID
[self showLoadingScreen];
self.userID = [NSString stringWithFormat:@""];
[self.container fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) {
if (error== nil) {
NSLog(@"USER ID: %@", recordID.recordName);
self.userID = [NSString stringWithFormat:@"%@", recordID.recordName];
}else{
NSLog(@"An error occured in %@: %@", NSStringFromSelector(_cmd), error);
}
// After done, we'll hide loading screen.
[self hideLoadingScreen];
}];
}