遅延

2012-05-03 36 views
1

せずに画面をキャプチャする必要があるので、みんな画像を取得するために起こった遅延(0.5秒)です。私は、時間プロファイラでこの機器が遅延を引き起こすものとしてこの機器を指していると指しています。だから、アドバイス、提案はどうすればこの遅延を回避できますか?遅延

ありがとうございました。

注: 1.Imブック効果のためUIPageControllerを使用。私はこれを解決する最良の方法は、デリゲートを使用することで、このlink

答えて

1

を確認してくださいしようとしているものを

2.toチェック。あなたはそれを実装する方法に応じて(「ねえ、今私はあなたにXXXのためにイメージを得ました」。 あなたはロードすることができますこの方法では、あなたがイメージを作るために、デリゲートメソッドを伝えるならば、それはバックグラウンドでそれを行うと、あなたの視野を伝えることができることを意味あなたのビューその中に電子書籍でだけは、デフォルトの背景と本の真ん中にローダーを示した。画像が完了したら、あなたは正しいイメージを持つ書籍のビューを更新し、ローダーを削除します。 多くのようなどのようにAppleのiBookは、他の優れたアプリケーションは、(あなたの必要性に適応し、まだのUITableViewControllerで使用するため)私自身のプロジェクトの一つから

例を行います。
BookDelegate.h

#import <Foundation/Foundation.h> 

@class Book; 

@protocol BookDelegate <NSObject> 

@optional 
- (void)didRecieveImageForBook:(NSString*)imagePath indexPath:(NSIndexPath*)indexPath; 

@end 

Book.h

#import <Foundation/Foundation.h> 
#import "BookDelegate.h" 

@interface Book : NSOperation <NSObject> 
{ 
    id <BookDelegate> delegate; 
    SEL didRecieveImageForBookSelector; 
} 

@property (strong, nonatomic) id delegate; 
@property (assign) SEL didRecieveImageForBookSelector; 

- (NSString*)getBookImageForBookId:(int)BookId externalRefference:(NSString*)url indexPath:(NSIndexPath*)indexPath; 
- (id)delegate; 

// Delegate methods 
- (void)didRecieveImageForBook:(NSString*)imagePath indexPath:(NSIndexPath*)indexPath; 

@end 

Book.m

#import "Book.h" 
#import <objc/runtime.h> 

@implementation Book 

static char kAssociationKey; 

@synthesize didRecieveImageForBookSelector; 
@synthesize delegate; 

- (id)init 
{ 
    if (self = [super init]) 
    { 
     [self setDidRecieveImageForBookSelector:@selector(didRecieveImageForBook:indexPath:)]; 
    } 
    return self; 
} 

#pragma mark - 
#pragma mark The default delegate functions 

- (void)didRecieveImageForBook:(NSString*)imagePath indexPath:(NSIndexPath*)indexPath 
{ 
    NSLog(@"********************************************************"); 
    NSLog(@"*** PLEASE IMPLEMENT THE FOLLOWING DELEGATE FUNCTION ***"); 
    NSLog(@"***  didRecieveImageForBook:indexPath:  ***"); 
    NSLog(@"********************************************************"); 
} 

#pragma mark - 
#pragma mark Function for fechting images 

// This method is not adapted to what YOU need, but left my code here in case it might help you out. 
- (NSString*)getBookImageForBookId:(int)bookId externalRefference:(NSString*)url indexPath:(NSIndexPath*)indexPath 
{  
    NSString *ext = [[url lastPathComponent] pathExtension]; 

    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 

    NSString *imagePath = [documentsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@%d.%@", APP_BookIMAGEPEFIX, BookId, ext]]; 
    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:imagePath]; 

    if (fileExists) 
    { 
     return imagePath; 
    } 
    else { 
     NSURL *theUrl = [NSURL URLWithString:url]; 

     ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:theUrl]; 
     [request setDidFinishSelector:@selector(BookImageFetched:)]; 
     [request setDidFailSelector:@selector(processFailed:)]; 
     [request setTimeOutSeconds:60]; 
     [request setDownloadDestinationPath:imagePath]; 
     [request setDelegate:self]; 

     [request startAsynchronous]; 

     objc_setAssociatedObject(request, &kAssociationKey, indexPath, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 

     return @""; 
    } 
} 

- (void)BookImageFetched:(ASIHTTPRequest *)request 
{ 
    NSIndexPath *indexPath = objc_getAssociatedObject(request, &kAssociationKey); 
    NSString *imagePath = request.downloadDestinationPath; 

    [[self delegate] performSelector:self.didRecieveImageForBookSelector withObject:imagePath withObject:indexPath]; 
} 

#pragma mark - 
#pragma mark delegate functions 

- (id)delegate 
{ 
     return delegate; 
} 

- (void)setDelegate:(id)newDelegate 
{ 
     delegate = newDelegate; 
} 

#pragma mark - 

@end 
+0

ので、他の言葉であなたは、メモリ内の画像や店舗など、すべての本のページをキャプチャすることをお勧めしています?! –

+0

これを行うには1つの方法があります。私のプロジェクトの1つでは、ローカルに保存したTVチャンネルのPNG画像をダウンロードしました。ローカルイメージがあるかどうかを確認して、それが返された場合はそれを直接返しました。それ以外の場合は空の文字列を返し、デリゲートメソッドがUITableViewに新しいイメージavailaleがあり、特定のrowAtIndexPathに属していることを伝えました。次に、そのセルを新しい画像で更新しました。 –

+0

ok私は..私の場合はチャプター(HTMLファイル)を読み込んでjs関数を使ってページを設定しているので、すでにコンテンツを持っています。ユーザーがページをレンダリングする瞬間に次/前のページをキャプチャする必要があります。私の機能はうまくいきますが、その遅延が嫌い、ソリューションが遅延を完全に解決しません。 –

1

あなたはGCDを使用することができます - 私はあなたが与えたリンクでGCDから欠落しているステップに気づきました。これは私が非同期的に画像を取得し、それが正常に動作したときにその準備をして通知するために使用するものです。

dispatch_queue_t concurrent = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); 
    dispatch_async(concurrent, ^{ 
     __block UIImage *image = nil; 
     dispatch_sync(concurrent, ^{ 
      //put code to grab image here 
     }); 
     dispatch_sync(dispatch_get_main_queue(), ^{ 
      //this gets called when the above is finshed 
      //you should also check if the image is nil or not 
     }); 
    }); 

が、それはレコードの

に役立ちます願っています - 私はUIViewのスナップショットを取るためにこれを使用し、常に配置しようそれが一時的であっても私のターゲットは親ビューの中にあります - スピードアップしているようです。

UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0.0); 
[self.layer renderInContext:UIGraphicsGetCurrentContext()]; 

UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
return image; 

あなたが同じアプローチを使用しているのかどうかはわかりません。私はあなたがすぐにこの問題を解決を願って:)

+0

残念ながら、これは遅延を解決しない、それは白いページ(nilイメージ)を表示します! –

+0

ああ、あなたのようにしたいです...インスタントインスタント画像撮影...どのデバイスを使用しているか、画像の複雑さによっては半分かかります。私が投稿したGCDのことは、あなたがイメージを即座に表示していなかったと仮定していたことです。 –