如何将自定义UIView添加为加载屏幕

时间:2015-02-26 02:38:21

标签: ios objective-c asynchronous block loading

我试图在这个网站上搜索和检查很多问题,但我仍然找不到我的问题的答案。也许有一些类似的问题可以解决我的问题,但我没有足够的经验来了解这一点,请原谅我。

我正在开发一个使用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时,加载屏幕消失了(这很容易,所以我没有包含在下面的代码中)

请帮助我,我的问题可能很愚蠢,但我是新手,我还有很多东西值得学习,所以请随时问我任何与此相关的问题。 非常感谢你!

3 个答案:

答案 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];
    }];

    }