gpt4 book ai didi

ios - 循环打开 UIDocument

转载 作者:行者123 更新时间:2023-11-29 03:03:26 25 4
gpt4 key购买 nike

我正在尝试打开多个 UIDocument循环中的实例,使用 - (void)openWithCompletionHandler:(void (^)(BOOL success))completionHandler .

准确地说,我正在从文档文件夹加载一个文件列表,每个文件代表一个可以登录我的应用程序的用户。现在,显然我想在所有用户/UIDocument 之后显示我的登录对话框被打开。不幸的是,我似乎无法为此想出一个好的方法。我所拥有的是:

 -(void)reloadUsers
{
__block int cnt= 0;

NSArray* localDocuments = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[[AppDelegate localDocumentsDirectoryURL] path] error:nil];

for (NSString* document in localDocuments)
{
if (![document hasSuffix:@".user"])
continue;

// User beeing UIDocument subclass

User* user=[[[User alloc] initWithFileURL:[NSURL fileURLWithPath:[[[AppDelegate localDocumentsDirectoryURL] path]
stringByAppendingPathComponent:document]]] autorelease];

NSLog(@"Opening user document at url '%@'/'%@' ...", [AppDelegate localDocumentsDirectoryURL], document);

[user openWithCompletionHandler:^(BOOL success)
{
[self.userList addObject:user];

cnt++;
}];
}

NSLog(@"Loaded %d local users", cnt);
}

问题 1:最后的 NSLog 是否会工作并显示实际加载的用户数,还是自 cnt++ 以来它是一个随机值?是异步完成的吗?

问题 2:如何更改上述功能,以便我可以安全地执行以下操作:

 {   // app finished loading

[MyClass reloadUsers];

[LoginDialog show]; // this shall happen AFTER reloadUsers has loaded ALL documents
}

最佳答案

我发现将循环转换为递归是序列化异步操作的有用方法。例如(这是一些记事本编程,可能无法编译,但你明白了):

此函数递归加载所有文档,然后调用完成处理程序:

- (void)loadDoc:(int)doc in:(NSArray*)localDocuments withCompletion:(void(^)(void))completion
{
if (doc == [localDocuments count])
{
completion();
}
else
{
NSString* document = localDocuments[doc];

if (![document hasSuffix:@".user"])
{
[self loadDoc:doc + 1 in:localDocuments withCompletion:completion];
}
else
{

User* user=[[[User alloc] initWithFileURL:[NSURL fileURLWithPath:[[[AppDelegate localDocumentsDirectoryURL] path]
stringByAppendingPathComponent:document]]] autorelease];
[user openWithCompletionHandler:^(BOOL success)
{
[self.userList addObject:user];
[self loadDoc:doc + 1 in:localDocuments withCompletion:completion];
}];
}
}
}

为方便起见:

-(void)reloadUsersWithCompletion:(void(^)(void))completion
{

NSArray* localDocuments = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[[AppDelegate localDocumentsDirectoryURL] path] error:nil];
[self loadDoc:0 in:localDocuments withCompletion:completion];
}

然后显示您的对话:

{   // app finished loading

[MyClass reloadUsersWithCompletion:^(void) {

[LoginDialog show]; // this shall happen AFTER reloadUsers has loaded ALL documents
}];
}

当然还有其他涉及线程和同步机制的方法,但在我看来没有那么简单。

关于ios - 循环打开 UIDocument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23043606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com