在swift中

时间:2015-06-27 06:57:53

标签: ios multithreading swift uitableview

在我正在制作的应用中,我需要能够在tableView(_:)功能已创建单元格后将图像加载到表格单元格。我发现这可以通过线程完成,但我不确定它是如何完成的。

有人知道如何在tableView(_:)加载单元格的其余部分之后启动单独的线程,以便将图像添加到单元格,同时在表格视图中保持平滑滚动。

1 个答案:

答案 0 :(得分:0)

这是您研究的良好起点

http://www.raywenderlich.com/76341/use-nsoperation-nsoperationqueue-swift

查看本教程,它展示了如何使用nsoperation实现目标

我早先在obj-c上制作了这样的装载器,但你可以轻松地重写它

您可以修改代码以从文档加载图像。接下来的两个方法从文档目录中加载所有资产名称。

-(void) updateData
{
    [self.pendingOperations.downloadQueue addOperationWithBlock:^{
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSArray *filePathes = [self recursiveRecordsForResourcesOfType:@[@"png", @"jpeg", @"jpg",@"pdf"] inDirectory:documentsDirectory];
        @synchronized (self) {
            //self.documents = [NSArray arrayWithArray:fileRecords];
            self.documents = filePathes;
            NSLog(@"documents count %@", @([self.documents count]));
        }
        dispatch_async(dispatch_get_main_queue(), ^(void){
            //Run UI Updates
            [self.delegate modelDidUpdate:self];
        });

    }];

}

- (NSArray *)recursiveRecordsForResourcesOfType:(NSArray *)types inDirectory:(NSString *)directoryPath{

    NSMutableArray *filePaths = [[NSMutableArray alloc] init];

    NSMutableDictionary *typesDic = [NSMutableDictionary dictionary];
    for (NSString *type in types)
         [typesDic setObject:type forKey:type];

    // Enumerators are recursive
    NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager] enumeratorAtPath:directoryPath];

    NSString *filePath;

    while ((filePath = [enumerator nextObject]) != nil){

        // If we have the right type of file, add it to the list
        // Make sure to prepend the directory path
        if([typesDic objectForKey:[filePath pathExtension]]){
            //[filePaths addObject:[directoryPath stringByAppendingPathComponent:filePath]];
            CURFileRecord *record = [CURFileRecord new];
            record.filePath =[directoryPath stringByAppendingPathComponent:filePath];
            record.fileName = filePath;
            [filePaths addObject:record];
        }
    }


    return filePaths;
}

然后创建nsoperation子类并重写它:

// 3
- (void)main {

    // 4
    @autoreleasepool {

        if (self.isCancelled)
            return;
        NSData *fileData = [[NSFileManager defaultManager] contentsAtPath:self.fileRecord.filePath];
       // self.fileRecord.fileData = fileData;
        if (self.isCancelled) {
            fileData = nil;
            return;
        }

        if (fileData) {
            UIImage *newImage;
            if ([[self.fileRecord.filePath pathExtension] isEqualToString:@"pdf"])
            {
                CGPDFDocumentRef doc = [CURDocumentViewerUtilities MyGetPDFDocumentRef:fileData];
                newImage = [CURDocumentViewerUtilities buildThumbnailImage:doc withSize:CGSizeMake(64, 96)];
            }
            else
            {
                newImage = [CURDocumentViewerUtilities makePreviewImageFromData:fileData];
            }
            self.fileRecord.previewImage = newImage;
        }
        else {
            self.fileRecord.failed = YES;
        }

        fileData = nil;

        if (self.isCancelled)
            return;

        // 5
        [(NSObject *)self.delegate performSelectorOnMainThread:@selector(imageDownloaderDidFinish:) withObject:self waitUntilDone:NO];

    }
}

希望这有帮助