我已发布问题How to use Bolts Framework[Facebook+Parse]但现在我有疑问,如果我想使用Bolts-framework,我必须使用解析web服务吗?
他们提供下面的示例代码,它们与Parse webservice相关(saveAsync:
)。但我在Boltss' github
"Using these libraries does not require using any Parse services. Nor do they require having a Parse or Facebook developer account"
行中看到了这一点
[[object saveAsync:obj] continueWithBlock:^id(BFTask *task) {
if (task.isCancelled) {
// the save was cancelled.
} else if (task.error) {
// the save failed.
} else {
// the object was saved successfully.
SaveResult *saveResult = task.result;
}
return nil;
}];
现在我感到困惑,Is bolts framework need to use parse webservice?
注意:不要问你想在哪里使用Bolts-framework。看我这个问题的第一行。
答案 0 :(得分:1)
当然它不需要Parse webservice。我在实现自己的任务时遇到了同样的困难,我正在研究这个框架。看看BoltsTest code:你可以找到一些有用的代码。
我正在示例项目中尝试一些实验(https://github.com/giaesp/BoltsFrameworkSample)。基本上你需要定义自己的方法返回一个BFTask。这是一个简单的摘录。
- (BFTask*) parseHTML:(NSURL*)url searchString:(NSString*)searchString {
BFTaskCompletionSource * tcs = [BFTaskCompletionSource taskCompletionSource];
NSURLRequest * request = [NSURLRequest requestWithURL:url
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
timeoutInterval:30];
NSURLResponse * response;
NSError * error;
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (!error) {
NSString * receivedData = [NSString stringWithUTF8String:[returnData bytes]];
NSUInteger occurrences = [self countOccurencesOfString:@"iOS" inputString:receivedData];
[tcs setResult:[NSNumber numberWithInt:occurrences]];
}
else {
[tcs setError:error];
}
return tcs.task;
}
然后您可以使用您的方法作为文档说明并检查任务状态。
[[self parseHTML:[NSURL URLWithString:@"http://www.stackoverflow.com"]] continueWithBlock:^id(BFTask *task) {
if (task.isCancelled) {
// the task was cancelled
} else if (task.error) {
// the task failed
} else {
// the task completes
}
return nil;
}];
答案 1 :(得分:1)
我知道问题已经有一段时间了,但是mani想知道你是否可以使用AFNetworking的Bolts框架,我想添加一个显示用法的快速示例。
它写得很快,而且非常简单明了。
func taskWithPath(path: String) -> BFTask {
let task = BFTaskCompletionSource()
AFHTTPRequestOperationManager().GET(path, parameters: nil, success: { (operation, response) in
task.setResult(response)
}) { (operation, error) -> Void in
task.setError(error)
}
return task.task
}
希望这会有所帮助:)
答案 2 :(得分:0)
Bolts的想法是使用BFTask
封装任何操作。您不必将操作包装在方法中,但这是一种很好的方式来设想您应该如何构造代码:
- (BFTask*) asynchronousImageProcessOperation;
- (BFTask*) asynchronousNetworkOperation;
......所有这些都遵循类似的模式:
- (BFTask*) asynchronousNetworkOperation {
BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource];
// ... here's the code that does some asynchronous operation on another thread/queue
[someAsyncTask completeWithBlock:^(id response, NSError *error) {
error ? [source setError:error] : [source setResult:response];
}
return task;
}
它的美妙之处在于你可以用某种方式将这些任务串联在一起。例如,如果您需要处理图像然后上传它,您可以执行以下操作:
[[object methodReturnImageProcessingTask] continueWithBlock:^(BFTask *task) {
[[anotherObject imageUploadTaskForImage:task.result] continueWithBlock:^(BFTask *task) {
self.label.text = @"Processing and image complete";
}]
}]
当然,您也可以将两阶段任务封装在自己的任务中:
- (BFTask*) processAndUploadImage:(UIImage* image);
在此输入内存。它的排序和分组非常强大。伟大的框架。