Ios 将MKMapSnapshotter作为NSData保存在内存中-Swift

Ios 将MKMapSnapshotter作为NSData保存在内存中-Swift,ios,objective-c,swift,mkmapview,mkmapsnapshotter,Ios,Objective C,Swift,Mkmapview,Mkmapsnapshotter,我正在尝试拍摄我的MKMapView的屏幕截图。我通常在目标C中使用下面的代码来实现这一点 我想知道如何将NSData对象保存在内存中,而不是保存图像,然后立即从中读取 我还想知道如何用Swift编写这篇文章,特别是完成处理程序部分。我看了文档,但不确定语法: 就“保存”在内存中而言,您可以通过Objective-C完成块(或Swift关闭)返回NSData。从那里,您可以将NSData传递给另一个方法或将其保存在类属性中 例如,在Objective-C中: /** Request NSData

我正在尝试拍摄我的MKMapView的屏幕截图。我通常在目标C中使用下面的代码来实现这一点

我想知道如何将NSData对象保存在内存中,而不是保存图像,然后立即从中读取

我还想知道如何用Swift编写这篇文章,特别是完成处理程序部分。我看了文档,但不确定语法:

就“保存”在内存中而言,您可以通过Objective-C完成块(或Swift关闭)返回
NSData
。从那里,您可以将
NSData
传递给另一个方法或将其保存在类属性中

例如,在Objective-C中:

/** Request NSData of PNG representation of map snapshot.
 *
 * @param mapView The MKMapView for which we're capturing the snapshot
 * @param completion The completion block that will be called when the asynchronous snapshot is done. This takes two parameters, the resulting NSData upon success and an NSError if there was an error.
 */

- (void)requestSnapshotDataForMapView:(MKMapView *)mapView completion:(void (^)(NSData *data, NSError *error))completion
{
    MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init];
    options.region = mapView.region;
    options.size = mapView.frame.size;
    options.scale = [[UIScreen mainScreen] scale];

    MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc] initWithOptions:options];
    [snapshotter startWithCompletionHandler:^(MKMapSnapshot *snapshot, NSError *error) {
        if (error) {
            if (completion) {
                completion(nil, error);
            }
            return;
        }

        UIImage *image = snapshot.image;
        NSData *data = UIImagePNGRepresentation(image);
        if (completion) {
            completion(data, nil);
        }
    }];
}

- (IBAction)didTouchUpInsideButton:(id)sender
{
    [self requestSnapshotDataForMapView:self.mapView completion:^(NSData *data, NSError *error) {
        if (error) {
            NSLog(@"requestSnapshotDataForMapView error: %@", error);
            return;
        }

        // do whatever you want with the `data` parameter here, for example,
        // if you had some `@property (nonatomic, strong) NSData *snapshotData;`,
        // you might do:
        //
        // self.snapshotData = data

        // now initiate the next step of the process in which you're presumably
        // going to use the `data` provided by this block.
    }];
}
Swift等价物为:

/// Request NSData of PNG representation of map snapshot.
///
/// - parameter mapView:     The MKMapView for which we're capturing the snapshot
/// - parameter completion:  The closure that will be called when the asynchronous snapshot is done. This takes two parameters, the resulting NSData upon success and an NSError if there was an error.

func requestSnapshotData(mapView: MKMapView, completion: (NSData?, NSError?) -> ()) {
    let options = MKMapSnapshotOptions()
    options.region = mapView.region
    options.size = mapView.frame.size
    options.scale = UIScreen.mainScreen().scale

    let snapshotter = MKMapSnapshotter(options: options)
    snapshotter.startWithCompletionHandler() { snapshot, error in
        guard snapshot != nil else {
            completion(nil, error)
            return
        }

        let image = snapshot!.image
        let data = UIImagePNGRepresentation(image)
        completion(data, nil)
    }
}

@IBAction func didTouchUpInsideButton(sender: AnyObject) {
    requestSnapshotData(mapView) { data, error in
        guard data != nil else  {
            print("requestSnapshotData error: \(error)")
            return
        }

        // do whatever you want with the `data` parameter here, for example,
        // if you had some `var snapshotData: NSData?` class property, you might do:
        //
        // self.snapshotData = data

        // now initiate the next step of the process in which you're presumably
        // going to use the `data` provided by this closure.
    }
}

坦率地说,如果您试图在其他地方使用
UIImage
,我可能会将这些块/闭包参数更改为使用
UIImage
,而不是
NSData
,但希望这能说明这一点。

非常理想,谢谢
/// Request NSData of PNG representation of map snapshot.
///
/// - parameter mapView:     The MKMapView for which we're capturing the snapshot
/// - parameter completion:  The closure that will be called when the asynchronous snapshot is done. This takes two parameters, the resulting NSData upon success and an NSError if there was an error.

func requestSnapshotData(mapView: MKMapView, completion: (NSData?, NSError?) -> ()) {
    let options = MKMapSnapshotOptions()
    options.region = mapView.region
    options.size = mapView.frame.size
    options.scale = UIScreen.mainScreen().scale

    let snapshotter = MKMapSnapshotter(options: options)
    snapshotter.startWithCompletionHandler() { snapshot, error in
        guard snapshot != nil else {
            completion(nil, error)
            return
        }

        let image = snapshot!.image
        let data = UIImagePNGRepresentation(image)
        completion(data, nil)
    }
}

@IBAction func didTouchUpInsideButton(sender: AnyObject) {
    requestSnapshotData(mapView) { data, error in
        guard data != nil else  {
            print("requestSnapshotData error: \(error)")
            return
        }

        // do whatever you want with the `data` parameter here, for example,
        // if you had some `var snapshotData: NSData?` class property, you might do:
        //
        // self.snapshotData = data

        // now initiate the next step of the process in which you're presumably
        // going to use the `data` provided by this closure.
    }
}