小编And*_*rew的帖子

NSURLSession线程:跟踪多个后台下载

所以我在主线程上创建我的下载

NSURLRequest *request = [NSURLRequest requestWithURL:download.URL];
NSURLSessionDownloadTask *downloadTask = [self.downloadSession downloadTaskWithRequest:request];
[downloadTask resume];
Run Code Online (Sandbox Code Playgroud)

并将与下载相关联的NSManagedContextID添加到NSMutableDictionary中,以便稍后在委托回调中检索它

[self.downloads setObject:[download objectID] forKey:[NSNumber numberWithInteger:downloadTask.taskIdentifier]];
Run Code Online (Sandbox Code Playgroud)

我的self.downloadSession上面配置是这样的

- (NSURLSession *)backgroundSession
{
static NSURLSession *session = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.test.backgroundSession"];
    configuration.discretionary = YES;
    session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
});
return session;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是委托回调似乎在不同的线程上调用

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{   
    NSManagedObjectID *downloadID = [self.downloads objectForKey:[NSNumber numberWithInteger:downloadTask.taskIdentifier]];

    double progress = (double)totalBytesWritten / (double)totalBytesExpectedToWrite;

    NSDictionary *userInfo = [NSDictionary …
Run Code Online (Sandbox Code Playgroud)

multithreading objective-c ios ios7 nsurlsession

15
推荐指数
1
解决办法
2万
查看次数

CKFetchRecordChangesOperation-moreComing

changesOperation.fetchRecordChangesCompletionBlock = ^(CKServerChangeToken *serverChangeToken, NSData *clientChangeTokenData, NSError *operationError){

    //encode and save token

    NSData *encodedServerChangeToken = [NSKeyedArchiver archivedDataWithRootObject:serverChangeToken];

    [[NSUserDefaults standardUserDefaults] setObject:encodedServerChangeToken forKey:fetchToken];

    [[NSUserDefaults standardUserDefaults] synchronize];



    //handle more - **this causes a retain cycle**
    if(changesOperation.moreComing){

    }

};
Run Code Online (Sandbox Code Playgroud)

嗨,您只是想知道在fetchRecordChangesCompletionBlock中,文档说:

如果服务器无法使用此操作对象传递所有更改的结果,则在执行fetchRecordChangesCompletionBlock属性中的块之前,将此属性设置为YES。要获取其余更改,请使用服务器返回的更改令牌创建一个新的CKFetchRecordChangesOperation对象。

在上面的代码中,这将导致一个保留周期,因此应如何处理?在重新创建操作时,是否可以使用已创建的相同完成块?

ios ios8 cloudkit

4
推荐指数
1
解决办法
1180
查看次数

标签 统计

ios ×2

cloudkit ×1

ios7 ×1

ios8 ×1

multithreading ×1

nsurlsession ×1

objective-c ×1