我想知道如何正确执行以下操作:我有一个返回 NSData
对象的方法。它从 UIDocument
中获取 NSData
对象。 NSData
对象可能会变大,因此我想确保它在响应开始之前已完全加载。因此,我想从 block 本身中返回方法的值。所以像这样:
- (NSData*)getMyData {
MyUIDocument *doc = [[MyUIDocument alloc] initWithFileURL:fileURL];
[doc openWithCompletionHandler:^(BOOL success) {
if (success) {
return doc.myResponseData; // this is to be the return for the method not the block
}
}];
}
这会导致错误,因为 return
显然是指 block
的 return
。
我怎样才能做到这一点而不必使线程阻塞 wait/while 循环?
谢谢。
最佳答案
你不能。接受您尝试执行的操作是异步的这一事实,并将完成 block 参数添加到您的 getMyData
方法中,该方法在调用内部完成处理程序时调用。 (并从方法签名中删除 return
):
- (void)getMyDataWithCompletion:(void(^)(NSData *data))completion {
MyUIDocument *doc = [[MyUIDocument alloc] initWithFileURL:fileURL];
[doc openWithCompletionHandler:^(BOOL success) {
completion((success ? doc.myResponseData : nil));
}];
}
同样的问题存在于swift中,你可以添加一个类似的完成 block :
func getMyData(completion: ((data: NSData?) -> Void) {
data = ...
completion(data)
}
关于ios - 从内部 block 返回方法对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22267865/