开发者社区> 问答> 正文

iOS SDK waitUntilFinished一直阻塞主线程


1. 根据demo、测试用例和文档上的方法运行waitUntilFinished都会长期阻塞主线程
Warning: A long-running operation is being executed on the main thread. Break on warnBlockingOperationOnMainThread() to debug.
        OSSTask * initTask = [client multipartUploadInit:init];
        [initTask waitUntilFinished];

2. 我想问一下,要实现断点续传,是不是只按照文档这部分,是没办法实现的,还需要通过分片上传,这部分代码只是用在分片上传暂停之后,继续续传
__block NSString * uploadId = nil;
OSSInitMultipartUploadRequest * init = [OSSInitMultipartUploadRequest new];
init.bucketName = <bucketName>;
init.objectKey = <objectKey>;
// 以下可选字段的含义参考:
// append.contentType = @"";
// append.contentMd5 = @"";
// append.contentEncoding = @"";
// append.contentDisposition = @"";
// init.objectMeta = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"x-oss-meta-name1", nil];
// 先获取到用来标识整个上传事件的UploadId
OSSTask * task = [client multipartUploadInit:init];
[[task continueWithBlock:^id(OSSTask *task) {
    if (!task.error) {
        OSSInitMultipartUploadResult * result = task.result;
        uploadId = result.uploadId;
    } else {
        NSLog(@"init uploadid failed, error: %@", task.error);
    }
    return nil;
}] waitUntilFinished];
// 获得UploadId进行上传,如果任务失败并且可以续传,利用同一个UploadId可以上传同一文件到同一个OSS上的存储对象
OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];
resumableUpload.bucketName = <bucketName>;
resumableUpload.objectKey = <objectKey>;
resumableUpload.uploadId = uploadId;
resumableUpload.partSize = 1024 * 1024;
resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
    NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
};
resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:<your file path>];
OSSTask * resumeTask = [client resumableUpload:resumableUpload];
[resumeTask continueWithBlock:^id(OSSTask *task) {
    if (task.error) {
        NSLog(@"error: %@", task.error);
        if ([task.error.domain isEqualToString:OSSClientErrorDomain] && task.error.code == OSSClientErrorCodeCannotResumeUpload) {
            // 该任务无法续传,需要获取新的uploadId重新上传
        }
    } else {
        NSLog(@"Upload file success");
    }
    return nil;
}];
// [resumeTask waitUntilFinished];
// [resumableUpload cancel];
谢谢

展开
收起
fidetro 2017-06-01 09:44:18 7242 0
2 条回答
写回答
取消 提交回答
  • 回 1楼魔咒626的帖子
    楼主的第一个问题麻烦回答下哦,我也遇到了,分片上传的时候,按照你们的例子初始化的时候就卡住了。。。

    -------------------------

    回 1楼魔咒626的帖子
    请问下,分片上传的功能需要额外开通服务吗?我这边单个普通文件上传是OK的,分片上传就一直卡住了,求破呢

    -------------------------

    回 4楼魔咒626的帖子
    给个联系方式私聊下?初始化的时候跪了,一直卡在等待返回的那一步,没有返回成功或者错误信息

    -------------------------

    ReiOS SDK waitUntilFinished一直阻塞主线程
    问题解决了。原因是我在主线程调用分片上传的接口,waitUntilFinished这个接口会把主线程阻塞,

    因为SDK内部是懒加载,所以第一次上传的时候需要获取token,而且上传需要的token的获取也在主线程返回,所以拿不到token上传就跪了。。。。
    关键是SDK应该给个提醒好吧,比如没有token无法上传之类的,而不是直接卡住我的线程啊,
    2017-08-22 21:20:59
    赞同 展开评论 打赏
  • 嗯,分片上传好像可以用多线程同时上传的。

    -------------------------

    不需要额外开通,分片上传的大概流程是先要初始化分片上传,然后一片一片传,最后是完成传输或者放弃传输。详细信息参考下列文档:
    https://www.alibabacloud.com/help/zh/doc-detail/31991.htm?spm=a3c0i.l31815zh.b99.325.3ced91bdmVyT0y

    2017-06-02 14:36:14
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
手淘iOS性能优化探索 立即下载
From Java/Android to Swift iOS 立即下载
深入剖析iOS性能优化 立即下载