Rumah > Soal Jawab > teks badan
刚在看sdwebimage的源码,在SDWebImageDownloaderOperation这个类的start方法里,
- (void)start {
@synchronized (self) {
if (self.isCancelled) {
self.finished = YES;
[self reset];
return;
}
#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0
if ([self shouldContinueWhenAppEntersBackground]) {
__weak __typeof__ (self) wself = self;
self.backgroundTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
__strong __typeof (wself) sself = wself;
if (sself) {
[sself cancel];
[[UIApplication sharedApplication] endBackgroundTask:sself.backgroundTaskId];
sself.backgroundTaskId = UIBackgroundTaskInvalid;
}
}];
}
#endif
self.executing = YES;
self.connection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self startImmediately:NO];
self.thread = [NSThread currentThread];
}
[self.connection start];
if (self.connection) {
if (self.progressBlock) {
self.progressBlock(0, NSURLResponseUnknownLength);
}
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStartNotification object:self];
});
if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_5_1) {
// Make sure to run the runloop in our background thread so it can process downloaded data
// Note: we use a timeout to work around an issue with NSURLConnection cancel under iOS 5
// not waking up the runloop, leading to dead threads (see https://github.com/rs/SDWebImage/issues/466)
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, false);
}
else {
CFRunLoopRun();
}
if (!self.isFinished) {
[self.connection cancel];
[self connection:self.connection didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorTimedOut userInfo:@{NSURLErrorFailingURLErrorKey : self.request.URL}]];
}
}
else {
if (self.completedBlock) {
self.completedBlock(nil, nil, [NSError errorWithDomain:NSURLErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Connection can't be initialized"}], YES);
}
}
#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0
if (self.backgroundTaskId != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskId];
self.backgroundTaskId = UIBackgroundTaskInvalid;
}
#endif
}
[self.connection start];
开启了connection, 然后判断connection是否存在,如果存在的话,里面有一段
if (!self.isFinished) {
[self.connection cancel];
[self connection:self.connection didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorTimedOut userInfo:@{NSURLErrorFailingURLErrorKey : self.request.URL}]];
}
这一段我就不理解了,如果它没有结束,就取消connection。刚刚开启connection,现在就取消connection?而且是不结束的时候取消,这是什么意思?
PHPz2017-04-18 09:07:56
Boleh difahami bahawa sebelum muat turun mempunyai hasil (penyiapan biasa, atau ralat berlaku), kod akan sentiasa disekat dalam CFRunLoopRun() atau CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, false). , selepas memulakan panggilan, muat turun akan diteruskan, penyekatan ini tidak akan ditarik balik sehingga muat turun selesai atau ralat berlaku (CFRunLoopStop akan dipanggil dalam kedua-dua kes).
Pada masa ini, jika didapati isFinished masih TIDAK, ini bermakna ia telah tamat masa, batalkan sambungan semasa dan membuang ralat tamat masa.
怪我咯2017-04-18 09:07:56
beginBackgroundTaskWithExpirationHandler: Ia akan dicapai apabila anda memasuki latar belakang dan masa tamat apabila tamat masa, anda harus membatalkan sambungan untuk mengelakkan daripada menduduki sumber
巴扎黑2017-04-18 09:07:56
Kod teras ada di sini
CFRunLoopRun();
Ia menyekat utas semasa selama-lamanya sehingga CFRunLoopStop dipanggil tidak diketahui